• ベストアンサー

同じ名前のファイルにリダイレクト

あるファイルを処理し、そのファイルにそのままリダイレクトして書き出そうとした場合の処理に関してです。 例) sed 's/aaa/bbb/' hoge.txt > hoge.txt このようにするとhoge.txtの中身が消えてしまいます。 別名のファイルに書き出してmvすればよいのですが、なぜできないのか納得ができず悩んでいます。 お分かりの方いらっしゃればお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.3

No1 の方が書いているとおり、Linuxに限らず、UNIX系OSで(少なくともcsh系では)リダイレクトによって出力をファイルに落とそうとすると、出力先のファイルがまず作られてからコマンドが実行されます。 このとき、既存のファイルと同じ名前のファイルを出力先に指定すると、強制的に空ファイルによって上書きされます。 (なんでそういう設計になっているかは知りません) ちなみにMS-DOS(試してないけどたぶんWin2k以上のコマンドプロンプトも)では、リダイレクトの際はまずテンポラリファイルに出力されてからリダイレクト先のファイルにコピーされるため、質問文のような記述をしても問題なく実行結果が出力されます。

skip_jack
質問者

補足

詳しい説明ありがとうございました。

その他の回答 (2)

  • asfd
  • ベストアンサー率21% (25/117)
回答No.2

シェルの仕様です。既存のファイルをリダイレクト先に選ぶと、 ファイルサイズを0にします。その後、sedが実行されます。 なぜ、こんな仕様になっているのかは分かりませんが、この仕様のが 分かりやすいのは確かかと、、

skip_jack
質問者

お礼

そういう仕様なんですね。 納得しました。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

sedが実行される前に、シェルによってhoge,txtがoutputモードでオープンされるからです た ぶ ん

skip_jack
質問者

お礼

ご解答ありがとうございます。