파이프 쉘의 tty에서 읽기

파이프 쉘의 tty에서 읽기

다음과 같이 실행되는 스크립트가 있습니다.

곱슬https://example.com/install.shzsh--

스크립트는 사용 입력에서 읽어야 합니다.

read "human_name?Your human name ?"</dev/tty

문제는 사용자가 입력을 보고 응답을 입력할 수 있지만 응답이 human_name에 저장되지 않는다는 것입니다.

예:

cat <<EOM | zsh -
read "human_name?Your human name ?"</dev/tty   
if [ -z "$human_name" ] ; then echo "tears" ; else echo "HI" $human_name; fi
EOM

결과 :

Your human name ?Pat
tears

어떤 지침이 있습니까?

답변1

/dev/tty프로그램이 백그라운드 작업이 아닌 한 리디렉션을 통해 항상 터미널에서 읽을 수 있습니다. 백그라운드 작업인 경우 포그라운드로 전환될 때까지 SIGTTIN에 의해 ​​일시 중지됩니다.

스크립트의 문제는 터미널에서 읽는 것이 아니라 읽은 내용으로 무엇을 하느냐입니다. here 문서를 보간과 함께 사용했기 때문에 $human_namehere 문서가 빌드될 때 보간이 수행되었으며 당시에는 비어 있었습니다. 실행 중인 셸이 문서 zsh -를 보고 구문 분석할 수 있도록 보간이나 따옴표 달러 기호 없이 여기 문서를 사용해야 합니다.

고양이<<"마치다"zsh--
"human_name? 당신의 이름은 </dev/tty"입니다.   
if [-z "$human_name"]; 그렇지 않으면 echo "hi" $human_name;
결론

관련 정보