"awk...file|tee file" このファイルを切り捨てるのはなぜですか? [コピー]

"awk...file|tee file" このファイルを切り捨てるのはなぜですか? [コピー]

このパイプがファイルを切り捨てるのはなぜですか?

awk '...' file | tee file

そしてcat先にやるんですよね?

cat file | awk '...' | tee file

このファイルは、数百行の一般設定ファイルです。私はteeそれを使用しない傾向があります(最初にインストールする必要があるspongeためです)。moreutils

答え1

長期的に見ると、この動作が一貫性がないことがわかります。

問題は、teeある時点でファイルが書き込み用に開くことです。その瞬間からファイルが切り捨てられます。どのプログラムがファイルを読み取るかは問題ではありません。

これは非常に迅速に発生し、catファイルが開く前に読み取りが完了したようです。teeただし、たとえば、システムに過負荷がかかると、catシステムが完成せずにパイプがcat切断される可能性があります。

したがって、読み取りパイプと同じファイルに書き込まないでください。代わりにGnuawkを使用する-i inplaceか、システムで利用できない場合は、次のようにします。

cp file file.tmp &&
awk '...' file.tmp | tee file

関連情報