リダイレクトとパイプを図示してみた (補足)
「リダイレクトとパイプを図示してみた」の補足です。気づいたことを書き足しただけなので短いです。
(1)id:simply-k:20100731:1280607841
(2)id:simply-k:20100801:1280617927
(3)id:simply-k:20100802:1280617927
リダイレクトとパイプの比較
リダイレクトとパイプを、0、1、2といった番号*1の指定という観点から比較してみます。
リダイレクト
0、1、2などの番号を直接指定する。 (「0<」、「1>」、「2>」など)
パイプ
パイプ前のコマンドの標準出力と、パイプ後のコマンドの標準入力を結合する。正確には、パイプ前のコマンドの1番にデフォルトで割当てられられた出力ストリームと、パイプ後のコマンドの0番にデフォルトで割り当てられた入力ストリームが、結合されたかのように振る舞う。0、1、2などの番号は、ストリームの指定によって間接的に指定される。(この点で、リダイレクトよりもパイプの方が抽象度が高い。)
必ずしも、パイプ前のコマンドの1番とパイプ後の0番が結合されるわけではないという点に注意が必要です。例えば、次のような例が挙げられます。
- コマンドA 2>&1 | コマンドB
コマンドAの1番と2番が、コマンドBの0番と結合される。 - コマンドA 2>&1 1> ファイル | コマンドB
コマンドAの2番が、コマンドBの0番と結合される。