在 while-read 循环中等待键盘输入

在 while-read 循环中等待键盘输入

我有一个 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在每次提示时“自动按下”。

相关内容