パイプを元の位置に戻します。

パイプを元の位置に戻します。

誰かが考えるかもしれない

echo foo >a
cat a | rev >a

a含まれたままですがoof空です。

  1. なぜ?
  2. また、どのようにrev適用されますかa

ベストアンサー1

これのためのアプリがあります!spongefromコマンドは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は標準入力を読み取り、それを指定されたファイルに書き込みます。 シェルリダイレクトとは異なり、スポンジは出力ファイルに書き込む前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプラインを構築できます。

おすすめ記事