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

自分自身の知識を整理するため、リダイレクトとパイプの考え方を図示してみました。記事は3回に分ける予定です。
前回: -
次回: id:simply-k:20100801:1280617927

はじめに

Unix/LinuxシェルスクリプトWindowsコマンドプロンプトで使用するリダイレクトとパイプについて、考え方を図示しました。リダイレクトの表記法は、sh/bashコマンドプロンプトを前提にしています。
リダイレクトやパイプについての初歩的な説明は省いていますので、そのような説明がほしい方は、他のサイトや書籍を参照してください。

(1) コマンド


リダイレクトやパイプを使用しないコマンド実行です。
図の中の矢印は、ストリーム(データの流れ)を示しています。標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)が、自動的にオープンされます。それぞれ、データの出入口の0番、1番、2番と結びつきます。*1 一般的な環境では、標準入力はキーボードからの入力、標準出力と標準エラー出力は画面への出力となります。

(2) コマンド 0< ファイル *2


標準入力をファイルにリダイレクトします。内部的には、ファイルを読み込み用にオープンし、その入力ストリームを0番に結び付けます。

(3) コマンド 1> ファイル *3


標準出力をファイルにリダイレクトします。内部的には、ファイルを書き込み用にオープンし、その出力ストリームを1番に結び付けます。

(4) コマンド 2> ファイル


標準エラー出力をファイルにリダイレクトします。内部的には、ファイルを書き込み用にオープンし、その出力ストリームを2番に結び付けます。

(5) コマンド 1>&2


標準出力を標準エラー出力にリダイレクトします。内部的には、2番に結びつけられたストリーム(stderr)を1番に結び付けます。リダイレクトしない場合に標準出力と標準エラー出力に分かれて出力されるデータが、どちらも標準エラー出力として出力されることになります。
このタイプのリダイレクトは、出力が常に標準出力であるようなコマンドの出力を、標準エラー出力に切り替える場合にも利用できます。例えば、「echo メッセージ 1>&2」とすると、標準エラー出力へのメッセージ出力が可能となります。

(6) コマンド 2>&1


標準エラー出力を標準出力にリダイレクトします。内部的には、1番に結びつけられたストリーム(stdout)を2番に結び付けます。リダイレクトしない場合に標準出力と標準エラー出力に分かれて出力されるデータが、どちらも標準出力として出力されることになります。
このタイプのリダイレクトとパイプを組み合わせると、標準エラー出力に出力されるデータを別のコマンドに受け渡すことができます。例えば、「foo 2>&1 | more」とすることにより、fooコマンドのエラー出力をmoreで確認できるようになります。*4


(7)以降は次回です。
前回: -
次回: id:simply-k:20100801:1280617927

*1:0〜2はファイル記述子(ファイル・ディスクリプタ)です。

*2:「0<」は「<」と書いても同じです。

*3:「1>」は「>」と書いても同じです。

*4:「foo」は適当なコマンド名に置き換えて考えてください。