これこの質問は、私がよく理解しているかどうかわからないという考えを引き起こしました。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に残ります。
答え2
tee
コマンドはファイルを上書きし、ファイルを短くし(おそらく)ファイルからcat
データを読み取るコマンドの機能を削除するため、単にこれを行うことはできません。
tee
オープニングなどのプログラムがあるかどうか確認できれば新しい文書、そしてシェルでcat
そのコピーを最初に開くようにすると、古い(実際に削除された)ファイルから新しいファイルにコピーできます。しかし、家庭は多く、保証はほとんどありません。
cat
たとえば、この作業が最初に開始され、tee
後で(データをキャプチャする必要があるとき)開始されると考えることができます。しかし、シェルどちらも開始して開始するtee
前に入力を待たないと、書き込みcat
が失敗する可能性があります(待機者がなく、そのバイトが行く場所がないため)。を待つよりもプロセスが待つのはread
簡単ですwrite
。