各ループの繰り返し後にプロンプトを表示したいと思います。
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