읽기 명령의 입력을 명령 자체로 처리합니다.

읽기 명령의 입력을 명령 자체로 처리합니다.

스크립트에서 이 함수를 정의한다고 가정해 보겠습니다.

fct1() {
  local msg1=${@}
if [[ "${verb}" = 'tru' ]]; then
  echo "I say $msg1"
  sleep 1
  echo "i repeat"
  sleep 1
  echo "I saaaaaaaaay $msg1"
else
  echo "$msg1"
fi
}

사용자가 에서 이 함수를 호출하도록 하려면 어떻게 해야 합니까 read?

나는 다음과 같은 것을 생각하고 있었다

read fct1 "aha aha ahaaaaa"

출력은 다음과 같습니다:

"I say aha aha ahaaaaa" "I repeat" "I saaaaaaaaay aha aha ahaaaaa"

기본적으로 입력을 read변수에 저장하지 않고 대신 명령으로 사용하려면 어떻게 해야 합니까?

감사해요.

답변1

메시지를 stdin에서 라인(터미널에서 스크립트를 사용할 때 사용자가 입력)으로 읽은 다음 함수에 인수로 전달하려면 다음을 수행하면 됩니다.

fct1 "$(line)"

line더 이상 표준 명령은 아니지만 여전히 꽤 일반적입니다. 로 대체할 수 있지만 head -n1일부 구현에서는 입력이 터미널 장치에서 나오지 않을 때 한 줄 이상을 읽을 수 있습니다(한 줄만 출력하지만).

bash's 를 사용할 때는 read변수에 저장해야 합니다. 이것이 read입력을 변수에 저장하는 목적입니다.

IFS= read -r line && fct1 "$line"

zsh'를 사용하면 다음 옵션을 read사용할 수 있습니다.-e에코데이터는 변수에 저장되지 않고 읽혀지므로 line위의 내용은 다음과 같이 작성할 수 있습니다 IFS= read -re.

fct1 "$(IFS= read -re)"

(zsh가 출력을 read읽을 수 있도록 프로세스를 포크해야 하기 때문에 이는 변수를 사용하는 것보다 덜 효율적입니다 .)read

물론 다음을 교체할 수도 있습니다.

local msg1=${@}

그리고

local msg1; IFS= read -r msg1 || return

답변2

read유틸리티는 콜백 사용을 허용하지 않습니다(일반적인 Unix 도구에서 허용하는지 잘 모르겠습니다). 또한 읽은 데이터를 출력하지 않습니다.

당신이 해야 할 일은 read사용자가 제공한 콘텐츠를 가져와서 설명하는 대로 다시 출력하는 함수로 호출을 래핑하는 것입니다. 또는 다른 도구를 사용하여 입력을 읽고 원하는 출력을 생성합니다 awk.

또한 일반적으로 사용법이 variable=$@명확하게 정의되어 있지 않습니다. 명령줄 인수를 공백으로 구분된 값 목록으로 사용하려면 대신 사용하세요 variable="$*"(변수의 기본값을 가정 IFS).

답변3

이것은 매우 특이한 요청입니다... 흠... 터미널에서 함수의 위치 인수 목록으로 일부 입력을 가져오려면 다음을 시도하십시오.

fct1 "$(cat)"
dfergerg
I say dfergerg
i repeat
I saaaaaaaaay dfergerg

catEOF(CTRL-D) 문자를 입력할 때까지 계속 됩니다 . vert변수가 tru함수 외부에 설정되어 있는지 확인하세요 .

관련 정보