답변:
제어 터미널 장치에서 읽습니다.
read input </dev/tty
더 많은 정보 : http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
bash yourscript < /foo/bar
사용자 입력을 기다립니다. 이것은 암호를 읽을 때만 허용됩니다. @GordonDavisson의 답변은 다른 모든 용도로 선호됩니다.
일반 stdin을 유닛 3을 통해 리디렉션하여 파이프 라인 내부를 유지할 수 있습니다.
{ cat notify-finished | while read line; do
read -u 3 input
echo "$input"
done; } 3<&0
BTW, 정말로 cat
이런 식으로 사용 하고 있다면 리디렉션으로 바꾸면 일이 훨씬 쉬워집니다.
while read line; do
read -u 3 input
echo "$input"
done 3<&0 <notify-finished
또는 해당 버전에서 stdin과 unit 3을 바꿀 수 있습니다. unit 3으로 파일을 읽고 stdin은 그대로 두십시오.
while read line <&3; do
# read & use stdin normally inside the loop
read input
echo "$input"
done 3<notify-finished
read line
notify-finished에서 읽고 있지만 쓰여진대로 실행 read -u 3 input
하면 콘솔에서 읽는 것 입니다)?
다음과 같이 루프를 변경하십시오.
for line in $(cat filename); do
read input
echo $input;
done
단위 테스트 :
for line in $(cat /etc/passwd); do
read input
echo $input;
echo "[$line]"
done
두 번 읽은 것처럼 보이지만 while 루프 내부에서 읽을 필요가 없습니다. 또한 cat 명령을 호출 할 필요가 없습니다.
while read input
do
echo $input
done < filename
read
의 행동을 "파일에서 읽기를 시도하기 때문에 옳지 않다"로 설명하는 것)와 그 대답 모두에서 분명합니다 filename
.