読み込み中にループ内のキーボード入力を待ちます。

読み込み中にループ内のキーボード入力を待ちます。

次のように構成された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すべてのプロンプトで「自動で押す」。

関連情報