各ループの繰り返しの後にプロンプトを表示したいです。
たとえば、1 回の反復が実行されると、Press Enter to continue
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
ループから継承した通常の標準入力を介してファイルから読み取りますが、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