リダイレクトとパイプを図示してみた (補足)

「リダイレクトとパイプを図示してみた」の補足です。気づいたことを書き足しただけなので短いです。
(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番と結合される。

*1:ファイルディスクリプタ、ファイルハンドルなどと呼ばれます。