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

OKWave

2007-09-18 13:00

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

あるファイルを処理し、そのファイルにそのままリダイレクトして書き出そうとした場合の処理に関してです。

例)

sed 's/aaa/bbb/' hoge.txt > hoge.txt

このようにするとhoge.txtの中身が消えてしまいます。 別名のファイルに書き出してmvすればよいのですが、なぜできないのか納得ができず悩んでいます。 お分かりの方いらっしゃればお教えください。

良回答

Linuxに限らず、UNIX系OSで(少なくともcsh系では)リダイレクトによって出力をファイルに落とそうとすると、出力先のファイルがまず作られてからコマンドが実行されます。

このとき、既存のファイルと同じ名前のファイルを出力先に指定すると、強制的に空ファイルによって上書きされます。 (なんでそういう設計になっているかは知りません)

ちなみにMS-DOS(試してないけどたぶんWin2k以上のコマンドプロンプトも)では、リダイレクトの際はまずテンポラリファイルに出力されてからリダイレクト先のファイルにコピーされるため、質問文のような記述をしても問題なく実行結果が出力されます。

回答

シェルの仕様です。既存のファイルをリダイレクト先に選ぶと、 ファイルサイズを0にします。その後、sedが実行されます。

なぜ、こんな仕様になっているのかは分かりませんが、この仕様のが 分かりやすいのは確かかと、、

ZDNET Japan 記事を毎朝メールでまとめ読み(登録無料)

ホワイトペーパー

新着

ランキング

  1. セキュリティ

    2023年OTサイバーセキュリティの現状レポート--75%の組織が過去1年間に1回以上の侵入を経験

  2. セキュリティ

    サイバーセキュリティ強化に向けてマイクロソフトが示す実践的な指針を紹介

  3. セキュリティ

    5分でわかる「AWS WAF」--基礎知識から運用で陥りやすい3つの落とし穴までを徹底解説

  4. セキュリティ

    最前線で活躍するトップランナーと本気で考える、これからのサイバーセキュリティ

  5. 経営

    ガートナーが指南、迅速な意思決定を促す「AI」活用を実践する3つの主要ステップ

NEWSLETTERS

エンタープライズ・コンピューティングの最前線を配信

ZDNET Japanは、CIOとITマネージャーを対象に、ビジネス課題の解決とITを活用した新たな価値創造を支援します。
ITビジネス全般については、CNET Japanをご覧ください。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]