このパイプがファイルを切り捨てるのはなぜですか?
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