コマンドラインで読み込んだファイルに上書きするには

[code]

    $ cat hoge.txt > hoge.txt
    
[/code]

これを実行すると、「`hoge.txt`の中身がそのまま`hoge.txt`に書き出されて結果的に中身は同じになる」と思っていたのですが、実行してみるとファイルの中身が空になり、容量も0バイトになってしまいます。

他のコマンドでも同様に読み込みファイルにたいして`>`をつかって上書きしようとすると中身が消えてしまいます。

上書きしたい場合はどうしたらよいのでしょうか。




シェルがコマンドラインを解釈した後、`hoge.txt` をオープンして 0 バイトにしてから `cat`
を起動するので当然の結果です。実行したいコマンドラインの前に `hoge.txt`
を一時ファイルにコピーして利用するか、実行結果を一時ファイルに出力したあと上書きする必要があります。

moreutils の `sponge`(1) が利用できる環境ならば、一時ファイルは不要で次のように実行できます。

[code]

    cat hoge.txt |sponge hoge.txt
    
[/code]

なお、ほかの回答にある元ファイルを一旦削除する方法は、元ファイルのファイル所有者とアクセス権が失なわれる可能性があるので注意が必要です。

