各whileループの繰り返し後にプロンプ​​トを受け取るにはどうすればよいですか?

各whileループの繰り返し後にプロンプ​​トを受け取るにはどうすればよいですか?

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

Press Enter to continueたとえば、1回の反復を実行するときに2回目の反復後に再度実行する必要があり、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ループから継承された通常のstdinを介してファイル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

関連情報