bash:ファイルを出力した直後に次のコマンドの入力として使用するのは安全ですか?

bash:ファイルを出力した直後に次のコマンドの入力として使用するのは安全ですか?

ファイルに出力すると

somecommand > somefile

これをsomefile次の行のコマンドの入力パラメータとして渡すことはできますか?常にファイルが完全に作成された後にのみ実行されますか?それとも、これが安全であることを確認するために何かをすべきですか?

答え1

はい、前のコマンドが終了した場合は、次のコマンドで使用しても安全です。コマンドを順番に使用し、すべてが前景で実行されている場合(特にそうしない限り)、システムは残りの部分を処理すると信頼できます。ファイルが実際にディスクに書き込まれておらず、まだキャッシュにある場合でも、オペレーティングシステムはこの状況を透過的に処理します。

注:場合によっては、ファイルを中間結果の場所として使用することなく、より良い結果を得ることができます。プログラム出力の唯一の用途が次のプログラムを提供することであれば、パイプを使用できます。

dmesg | grep eth0 | less

答え2

閉じたファイルを安全に読み取ることができます

これを安全に実行できます。

somecommand > somefile
sort somefile

問題ありません。ただし、中間ステップやユーティリティがないと、通常書き込んでいるのと同じファイルからデータを読み取ることはできません。たとえば、

echo foo >  words
echo bar >> words

# This will clobber the file you're
# reading from. Don't do it!
sort < words > words

同じファイルを読み書きする必要がある場合

これらの一般的なニーズを満たす方法はいくつかあります。例えば、スポンジmoreutilsパッケージのユーティリティを使用すると、これを安全に実行できます。

echo foo >  words
echo bar >> words

# sponge is like tee, but soaks up all the input
# from the pipe before writing to your output file
sort words | sponge words

# your words are now sorted:
#   bar
#   foo
cat words

関連情報