処理された値でファイルを上書きできないのはなぜですか?

処理された値でファイルを上書きできないのはなぜですか?

これこの質問は、私がよく理解しているかどうかわからないという考えを引き起こしました。cat myfile | grep -v mypattern > myfileファイルハンドルの設定方法により、パイプを使用できないか正しくないことがわかります。しかし、なぜ単にcat myfile | grep -v mypattern| tee myfile>/dev/nullファイルの内部修正を使用できないのですか?簡単な失敗事例がありますか?

具体的にダメージを引き起こすのか、それともその場で編集せずに上書きするのに近いのでしょうか。

質問の更新、回答に次の事項も考慮していただければ幸いです。

使用に問題がありますかcat myfile | grep -v mypattern| bash -c 'rm myfile; cat > myfile'

ベストアンサー1

単に処理された値でファイルを上書きしません。

問題は、どちらが最初に実行されるかを保証できないことです。したがって、ファイルが読み取り用に開いていると確信するまで、ファイルのリンク解除と書き込みを延期する必要があります。

これにより、ファイルを書き込む前にRAMにバッファリングされます。

cat foo | perl -e 'undef $/; @out=<>; open WRT,">",shift; print WRT @out' foo

利点:fooの権限を維持します。中断されても、元のfoo.txtファイルは失われません。

欠点:fooはRAMに収まるべきです。

これにより、ファイルを読み、削除、cat削除できます。同時に、ファイルが消えるまで待ってから消えた場合に処理しますcat

(rm foo; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo)

利点:短い。 RAMより大きいファイルに適しています。

短所:fooは起動するとすぐに消えます。

(mv foo bar; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo && rm bar)

利点:RAMより大きいファイルに適しています。失敗すると、fooはバックアップとしてbarに残ります。

おすすめ記事