複数のオープン/クローズハンドルを回避するためにbashでファイルハンドルを開く構文または方法は何ですか?

複数のオープン/クローズハンドルを回避するためにbashでファイルハンドルを開く構文または方法は何ですか?

ファイルを開いたり生成したり、その中にループでたくさんの行を書きたいです。

基本的に私はそうします:

for i in {1..100}; do
  echo "line $i">>test.log
done

私の理解は、OSがtest.logファイルi時間を開いたり閉じたりすることです。

私は別の構文/アプローチを見つけました。

exec {log}>>test.log
for i in {1..1000}; do
  echo "line $i" >& $log
done
{log}>&-

すでに開いているファイルの使用 exec {log}>>test.log中にファイルを開いたり作成したり、開いたままにしたいとしますか?ファイルハンドルが閉じますか?echo "line $i" >& $log{log}>&-

この方法は何ですか?ユースケースの詳細情報はどこにありますか?

ベストアンサー1

表示されたユースケースでは、for複合コマンドの標準出力をリダイレクトできます。これにより、ファイル記述子を処理する必要がなくなります。

for i in {1..100}; do
    printf 'line %d\n' "$i"
done >test.log

これにより、名前付きファイルが作成または切り捨てられ、test.logループ内の標準出力ストリームのすべての出力(他の場所で明示的にリダイレクトされない限り)はそのファイルに移動されます。>>ファイルを切り捨てるのではなく、ファイルに追加するために使用されます。ファイルは一度だけ開きます。

他の複合コマンドでも同じことができます。

if [ -e file ]; then
    echo 'file exists'
else
    echo 'file does not exist'
fi >out.log
{
   echo 'line 1'
   cat some-file
   echo 'last line'
} >lines.txt

おすすめ記事