我有一个 bash 脚本,其结构如下:
while read foo bar baz;
do
echo "Processing $foo $bar $baz"
# more code here
done < /etc/somefile
在循环内,我希望脚本等待键盘输入(基本上只是“按 Enter 继续”。但是,循环内的以下代码
echo "Press [ENTER] to continue"
read -s
不会导致脚本停在那里 - 显然它从提供的文件而不是键盘获取输入。如何强制它从键盘读取?
答案1
read
除非明确指定,否则将文件送入循环将影响循环中的每个实例。以下工作有效:
echo "Press [ENTER] to continue"
read -s < /dev/tty
答案2
以下/bin/sh
代码打开文件描述符 3 作为标准输入的副本。在循环内部,read keypress
从这个新的文件描述符读取,而不是从送入循环本身的文件读取。最后,文件描述符被显式关闭。
exec 3<&0
while read -r foo bar baz; do
printf 'Processing %s, %s and %s\n' "$foo" "$bar" "$baz"
printf 'Press <enter> to continue: ' >&2
read keypress <&3
done <file
exec 3<&-
echo 'Done.'
这允许您使用,例如,
yes | ./script.sh
enter在每次提示时“自动按下”。