bash、tailを使用し、別のファイル記述子を使用してファイルを1行ずつ読みたいです。すべてのガイドは次の方法を使用します。
方法1:
echo 1111111 > z.txt
exec {newFD}< <(tail -f -c +0 "z.txt")
while IFS= read -r LINE0 <&${newFD}
do
printf '%s' "$LINE0"
done
ただし、このアプローチは次のように動作します。
方法2:
echo 1111111 > z.txt
while IFS= read -r LINE0 <&${newFD}
do
printf '%s' "$LINE0"
done {newFD}< <(tail -f -c +0 "z.txt")
2番目の方法を使用するのに問題がありますか?
exec
なぜ2番目の方法が必要ないのですか?ありがとうございます。
{newFD} が自動的に無料のファイル記述子を提供しました。この機能はbash 4.1+(2009-12-31)から利用可能です。 {varname} スタイル自動ファイル記述子の割り当て
答え1
知りません。どちらの場合も、新しいファイル記述子を割り当てて保存し、newFD
プロセスの置き換えから読み込みます。機能上の違いはありません。エラーの動作は2つの間で若干異なる場合がありますが、この場合は明確ではありません。
アプローチ1は、fdのライフサイクルに対してより透明にすることができます(いずれの場合でも、その範囲はwhileループに限定されません)、ソースを使用する場所に近づけることができます。明確にするためにこのように書くのが良いかもしれませんが、実際には違いはありません。どちらも後でファイル記述子を閉じる必要があります。
好きなスタイルで書くことができます。どちらも大丈夫です。
while read
ファイル記述子は開かれません。すべてのコマンドに存在する一般的なシェルリダイレクト操作コマンドとともに、while
またはコマンドとして発生します。exec
ループはwhile
単一の複合コマンドとして処理され、呼び出しシェル内で実行されます。コマンドに添付できるすべての一般的な項目は、whileループで使用することもできます。
持つ一部標準IOストリーム(または他のオープンFD)をリダイレクトするときのリダイレクトの特別な動作exec
:実際のコマンドを実行するサブシェルの環境だけでなく、現在のシェルの環境も永久に操作します。ただし、この場合は適用されません{newFD}< ...
。
このように新しいFDを動的に割り当てると、FDは常に子ではなく親に割り当てられます。それ以外の場合、変数は役に立ちません。これは意味するどのコマンドは機能します
: <{newFD} <(...)
同じことをしてくださいexec {newFD}< <(...)
。