同じファイルへのリダイレクトがファイルを切り詰めるのはなぜですか?


11

通常、別のファイルを使用して出力をリダイレクトします。

例えば ​​:

cat < first > temp

このコマンドでは、firstの内容は標準出力ではなくtempにリダイレクトされます。

次に、同じファイル名を使用すると、なぜファイルが切り捨てられますか?

同じファイルを上書きできないのはなぜですか?

cat < first > first 

回答:


19

このようなI / Oリダイレクトを使用すると、コマンドが実行される前に「入力」ファイルと「出力」ファイルの両方がシェルによって開かれます。また、上書きのためにファイルを開くことは、書き込む前に切り捨てることと同じです。結果:cat入力に空のファイルが表示されます...


0

一般的なケースでの取り扱いは非常に複雑だからです。次の例を考えてください。

プログラムは、ファイルを1行ずつ読み取り、各行を2回出力します。これが2番目のファイルなしで(つまり、同じファイル上で)動作するためには、読み取る前に上書きされるため、プログラムは読み取る行のほとんど(すべて)をバッファリングする必要があります。

単純なプログラムでは、問題を解決するために、通常、セカンダリの一時ファイルを使用します。一時ファイルは、終了すると元のファイルに移動します。これは、たとえばsed -i(インライン)の動作方法です。


0

通常、この場合のリダイレクトの構文はそうである必要がありますcat first > temp。これは、catの出力がfirstのファイルに送信されることを意味しますtemp。ステートメントの場合cat < first > temp、出力catは再びoutにリダイレクトされる時点で完了していません。何も結果が何も得られません。

ただしcat、ファイルと出力を別のファイルにリダイレクトすることは、基本的なものと変わりませんcp


cat < first > tempうまく動作します。
JanC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.