왜 ' 스크립트를 bash로 파이핑 할 때`read`로`stdin`에서 읽을 수 없습니까?

문제에 대한 해결 방법이나 솔루션을 찾고 있지 않습니다. . 작동하지 않는지 이해할 수 없습니다.

다음 스크립트가 작동하지 않는 이유에 대한 자세한 답변을 찾고 있습니다. unix.stackexchange.com의 게시물을 포함하여 이전의 모든 인터넷 검색 결과는이 문제를 완전히 지울 수 없습니다. iv id = “8fc3a57fa1에서 읽는 read와 관련이 있습니다. “>

stdin가 이미 cat에게 bash 파이프를 통해?

bash 스크립트 예 test.sh :

echo "Please say name:" read NAME echo "Hello $NAME" 

bash test.sh를 사용하여 스크립트를 호출하는 방법 1 :

$ bash test.sh Please say name: XYZ Hello XYZ $ 

파이핑을 통해 스크립트를 실행하는 방법 2 bash :

$ cat test.sh | bash Please say name: $ 

따라서 스크립트는 입력을 기다리거나 두 번째를 인쇄하지 않고 즉시 프롬프트로 돌아갑니다. 줄.

코멘트

  • 입력 echo "Hello $NAME"를 기다렸다가 종료했습니다.

답변

read를 사용하여 stdin에서 읽었지만 읽은 것은 표준 입력의 다음 줄인 . 해당 행을 읽은 후 더 이상 입력이 없어서 실행할 명령이 더 이상 없어 스크립트가 끝났습니다.

표준 입력 스트림이 하나만 있습니다. 코드와 데이터 모두에 사용하려고합니다. 이는 대화 형 bash 세션이 입력에서 명령을 읽는 방법 및 read 응답과 표준 입력을 사용하려는 다른 명령을 실행합니다.

스크립트 끝에 추가 줄을 추가하면 이런 일이 발생하는 것을 볼 수 있습니다.

echo "Please say name:" read NAME echo "Hello $NAME" printf "name=%s\n" "$NAME" 

둘 다 스크립트가 계속 실행되는지 확인하는 추가 명령을 제공하고 NAME에서 읽은 내용을 보여줍니다.

Please say name: name=echo "Hello $NAME" 

변수가 스크립트 파일에 기록 된 내용을 verbatim 보유하고 있음을 알 수 있습니다. 변수 보간, 실행 또는 확장이 발생하지 않았습니다.


터미널에서 read를 원하시면 가능합니다. 가장 간단한 방법은 TTY에 연결된 것으로 추정되는 표준 입력 (!) 대신 표준 출력에서 읽는 것입니다.

read NAME <&1 

이것은 내가 무언가를 입력 할 때까지 기다린 다음 나머지 프로그램으로 이동합니다. /dev/tty 또는 $(tty)를 사용할 수도 있습니다.

댓글

  • 틀림없이 read var </dev/tty는 stdout이 제어 tty에 연결되어 있다고 가정하는 것보다 낫습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다