문제에 대한 해결 방법이나 솔루션을 찾고 있지 않습니다. . 왜 작동하지 않는지 이해할 수 없습니다.
다음 스크립트가 작동하지 않는 이유에 대한 자세한 답변을 찾고 있습니다. 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: $
따라서 스크립트는 입력을 기다리거나 두 번째를 인쇄하지 않고 즉시 프롬프트로 돌아갑니다. 줄.
코멘트
답변
나 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에 연결되어 있다고 가정하는 것보다 낫습니다.
echo "Hello $NAME"
를 기다렸다가 종료했습니다.