while ループの各反復後にプロンプ​​トを表示するにはどうすればよいですか?

while ループの各反復後にプロンプ​​トを表示するにはどうすればよいですか?

各ループの繰り返しの後にプロンプ​​トを表示したいです。

たとえば、1 回の反復が実行されると、Press Enter to continue2 回目の反復の後にも再度、3 回目の反復の後にも再度、というように実行する必要があります。

使用していますread -p " Press enter to continue "(ただし、これはスキップされます)。

while read line

do

echo "$line" logs""

echo " "

echo "`tail -100 Domain1."$line"`"

read -p "Press enter to continue"

done<input.txt

答え1

ループ内のコマンドはread -p、から読み込んでいるため「スキップ」されます(実際にはそうではありません)input.txt。ループ内のすべてのコマンドは、デフォルトでループから標準入力ストリームを継承し、これはに接続されます。input.txt

代わりに、新しい入力ファイル記述子から読み取りを行いread line、そのファイルの内容を送信する必要があります。

while IFS= read -r line <&3; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

ここでは、ファイル記述子3(標準のファイル記述子の次に空いていて利用可能なファイル記述子)を使用し、それを入力ファイルに接続します。次に、read line明示的に読み取りを要求します。それファイル記述子は、標準入力 (ファイル記述子 0) からではなく、ファイル記述子から読み込まれます。これにより、標準入力が解放され、read -p通常どおりそこから読み取られます。

あるいは、上記のループから入力ファイル記述子を入れ替えることもできます。

while IFS= read -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt

ここで、 はread lineループから継承した通常の標準入力を介してファイルから読み取りますが、read -pはファイル記述子 3 から読み取ります。ファイル記述子 3 は、標準入力がファイルからリダイレクトされる前に、標準入力のコピーとして開かれます。

殻の中にはbash

read <&3

と書くこともできる

read -u 3

したがって、「最もクリーンな」解決策(ファイル記述子を操作する構文を最小限に抑えるという意味で)は次のようになります。

while IFS= read -u 3 -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

関連情報