Answers:
从控制终端设备读取:
read input </dev/tty
更多信息:http : //compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
bash yourscript < /foo/bar
将等待用户输入,仅当读取密码时才可接受。@GordonDavisson的答案对于所有其他用途都是可取的。
您可以通过单元3重定向常规的stdin,以将其保存在管道中:
{ cat notify-finished | while read line; do
read -u 3 input
echo "$input"
done; } 3<&0
顺便说一句,如果您确实使用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
”)中可以清楚地看出这一点以及他们接受的答案。