パイプとリダイレクトを含むコマンド

パイプとリダイレクトを含むコマンド

パイプと出力リダイレクトの両方を含むコマンドの実行順序は何ですか?

次のことを行うとしましょう。

Charles@myzone:/tmp$ mkdir /tmp/testdir      
Charles@myzone:/tmp$ cd /tmp/testdir   
Charles@myzone:/tmp/testdir$ touch file1 file2  
Charles@myzone:/tmp/testdir$ ls | wc -l
2
Charles@myzone:/tmp/testdir$ ls | wc -l > ls_result
Charles@myzone:/tmp/testdir$ cat ls_result
3

これにより、シェルは次の操作を実行するため、独自の名前が含まれることがls > resultわかります。result

1) 名前付きファイルの作成/開くresult 2) fd をresultstdout に設定 3) execls

最初は値がls_result2であると予想していましたが、結果として3が出ました。

質問

上記のコマンドはどのようにls | wc -w > ls_result実行されますか?

同等です(ls | wc -w ) > ls_resultか?

関連情報へのリンクはありますか? (Bashマニュアルを確認しました)

ベストアンサー1

utility1 | utility2 >output

等しくない

( utility1 | utility2 ) >output

それ以外の場合

utility1 | { utility2 >output; }

両方のユーティリティはほぼ同時に起動します。つまり、コマンドが時には3を返し、時には2を返したいという意味です。

例:

$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test

上記のパイプの右側に生成されたファイルは次のとおりです。時々パイプの左側で検出されます。

おすすめ記事