나는 이 문제에 대한 해결책이나 해결책을 찾고 있지 않습니다. 재중처럼 안 되서 다행이다 bash
. 난 그냥 이해가 안 돼요왜작동하지 않습니다.
다음 스크립트가 작동하지 않는 이유에 대한 자세한 답변을 찾고 있습니다. unix.stackexchange.com의 게시물을 포함하여 이전의 모든 인터넷 검색으로는 문제를 실제로 해결할 수 없었습니다. 이미 파이프를 통해 "가져오기"(?) 공급되고 있기 때문에 read
읽기가 stdin
작동하지 않는 것과 관련이 있습니까 ?stdin
cat
bash
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)
.