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

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

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

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

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

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

答え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

関連情報