パイプと出力リダイレクトの両方を含むコマンドの実行順序は何ですか?
次のことを行うとしましょう。
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
上記のパイプの右側に生成されたファイルは次のとおりです。時々パイプの左側で検出されます。
答え2
男乱交
REDIRECTION
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell. Redirection
may also be used to open and close files for the current shell execution environment. The following redirection operators may precede
or appear anywhere within a simple command or may follow a command. Redirections are processed in the order they appear, from left to
right.
したがって、コマンドを実行するとls_resultが生成され、lsコマンドが実行されます。そのため、出力は3です。
LS |トイレ -l > ls_results