誰かが考えるかもしれない
echo foo >a
cat a | rev >a
a
含まれたままですがoof
空です。
- なぜ?
- また、どのように
rev
適用されますかa
?
ベストアンサー1
これのためのアプリがあります!sponge
fromコマンドはmoreutils
まさにこれのために設計されています。 Linuxを実行している場合は、すでにインストールされています。そうでない場合は、オペレーティングシステムのリポジトリでsponge
またはを検索してくださいmoreutils
。その後、次のことができます。
echo foo >a
cat a | rev | sponge a
または避けてくださいウルク:
rev a | sponge a
この動作の理由は、コマンドが実行される順序によって異なります。実際に最初> a
に実行され、> file
ファイルを消去します。たとえば、
$ echo "foo" > file
$ cat file
foo
$ > file
$ cat file
$
したがって、実行時にcat a | rev >a
実際に行われることは、> a
最初に実行されてファイルが空になるため、cat a
実行時にファイルがすでに空になっていることです。これがsponge
次のように書かれた理由です(man sponge
、ハイライト内の項目)。
Spongeは標準入力を読み取り、それを指定されたファイルに書き込みます。 シェルリダイレクトとは異なり、スポンジは出力ファイルに書き込む前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプラインを構築できます。