パイプと出力リダイレクトの両方を含むコマンドの実行順序は何ですか?
次のことを行うとしましょう。
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 をresult
stdout に設定 3) execls
最初は値がls_result
2であると予想していましたが、結果として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
上記のパイプの右側に生成されたファイルは次のとおりです。時々パイプの左側で検出されます。