ファイル記述子はファイルの書き込みに最適化されていますか?

ファイル記述子はファイルの書き込みに最適化されていますか?

ファイル記述子に書き込むのではなく、ファイルに直接コマンドを印刷するのと同じですか?

イラスト

ファイルに直接書き込む:

for i in {1..1000}; do >>x echo "$i"; done

fdを使用してください:

exec 3>&1 1>x
for i in {1..1000}; do echo "$i"; done
exec 1>&3 3>&-

後者はより効率的ですか?

ベストアンサー1

execループの前にファイルを開くコマンドを使用することとループ内にリダイレクトを置くことの主な違いは、前者はファイル記述子を一度だけ設定することですが、後者はループが繰り返されるたびにファイルを開閉します。

一度実行する方が効率的ですが、ループ内で外部コマンドを実行すると、コマンドの開始に伴うコスト差がなくなることがあります。 (echoおそらくここに組み込まれているので適用されません)

出力が通常のファイルではなくファイルに転送される場合(x名前付きパイプなど)、ファイルの開閉操作が他のプロセスに表示される可能性があるため、動作に違いがある可能性があります。


commandによるリダイレクトとcommandによるリダイレクトの間には実際に違いはありません。execどちらもファイルを開き、ファイル記述子番号を処理します。

これらの2つはopen()ファイルとファイルwrite()であるため、ほぼ同じでなければなりません。 (ただし、命令実行中はfd 1が異なるように保存されます。)

for i in {1..1000}; do 
    >>x echo "$i"
done


for i in {1..1000}; do
    exec 3>&1 1>>x         # assuming fd 3 is available
    echo "$i"              # here, fd 3 is visible to the command
    exec 1>&3 3>&-
done

おすすめ記事