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