ファイルを開いたり生成したり、その中にループでたくさんの行を書きたいです。
基本的に私はそうします:
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