스크립트를 bash에 파이핑할 때 "stdin"에서 읽기 위해 "read"를 사용할 수 없는 이유는 무엇입니까?

스크립트를 bash에 파이핑할 때 "stdin"에서 읽기 위해 "read"를 사용할 수 없는 이유는 무엇입니까?

나는 이 문제에 대한 해결책이나 해결책을 찾고 있지 않습니다. 재중처럼 안 되서 다행이다 bash. 난 그냥 이해가 안 돼요작동하지 않습니다.

다음 스크립트가 작동하지 않는 이유에 대한 자세한 답변을 찾고 있습니다. unix.stackexchange.com의 게시물을 포함하여 이전의 모든 인터넷 검색으로는 문제를 실제로 해결할 수 없었습니다. 이미 파이프를 통해 "가져오기"(?) 공급되고 있기 때문에 read읽기가 stdin작동하지 않는 것과 관련이 있습니까 ?stdincatbash

Bash 스크립트 예 test.sh:

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

방법 1 스크립트를 호출합니다 bash test.sh.

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

방법 2 파이프라인을 통해 스크립트를 실행합니다 bash.

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

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

답변1

했다stdin에서 읽는 중이지만 read표준 입력에서 다음 줄을 읽는 중입니다 echo "Hello $NAME". 즉, 해당 줄을 읽은 후에는 더 이상 입력이 없으므로 더 이상 실행할 명령이 없으며 스크립트가 종료됩니다.

가지다단 하나표준 입력 스트림을 코드와 데이터 모두에 사용하려고 합니다. 이는 대화형 bash세션이 입력, read응답 및 표준 입력을 사용하기 위해 실행하는 기타 명령 에서 명령을 읽는 것과 같은 방식입니다 .

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

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

이는 둘 다 스크립트가 계속 진행되는 것을 확인하기 위한 추가 명령을 제공하고 다음에서 읽은 내용을 보여줍니다 NAME.

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

변수가 남아있는 것을 볼 수 있습니다말 그대로스크립트 파일에 기록된 내용 - 변수 보간, 실행 또는 확장이 발생하지 않습니다.


read터미널에서 이 작업을 수행하려는 경우 가능합니다. 가장 간단한 방법은 TTY에 연결된 표준 입력(!) 대신 표준 출력에서 ​​읽는 것입니다.

read NAME <&1

이것은 내가 뭔가를 입력할 때까지 기다린 다음 프로그램의 나머지 부분을 계속 진행합니다. /dev/tty또는 을 사용할 수도 있습니다 $(tty).

관련 정보