UNIX入門:5. 入出力とそのリダイレクト(I/0&I/ORedirection)

5.1. 「リダイレクト」とは?

 UNIX では,入出力 (Input/Output, I/O) がすべてファイル間で行われているということでした (第2項参照)。上記で列挙したコマンドも,入力ファイルや出力ファイルを指定しなければ,すべて,標準入出力,すなわち,ターミナルからの入出力となります。UNIX では,入力ファイルや出力ファイルを標準以外に切り替える (redirect) ことができ,これを「入出力のリダイレクト」(I/0 Redirection) といいます。

5.2. 入出力ファイルのリダイレクト

出力ファイルのリダイレクト (上書き):>
出力ファイルのリダイレクト (加える):>>
入力ファイルのリダイレクト (ファイル全体):<
入力ファイルのリダイレクト (ストップ・ワードまで標準入力:「ヒア・ドキュメント」):<<

5.3. パイプ (Pipes)

 Thompson と Ritchie が UNIX を開発した直後から,コマンドの出力を他のコマンドに渡すことを考え,数年後に実現することになります。コマンド command1 の出力をコマンド command2 の入力へ切り替えることを「パイプで繋ぐ」(piping) といいます。UNIX の特徴的な操作ともいえるでしょう。

% command1 | command2

パイピングは何回でも可能。

% command1 | command2 | command3 | command4

また,I/O リダイレクトとパイピングを併用することも可能。

% command1 | command2 > file

5.4. 標準エラー出力とそのリダイレクト

■標準エラー出力 (Standard Error Output)

 コマンドは,その処理にエラーがあれば,エラー・メッセージを出力します。

% cd ~/Mail
% ls
man_sh.txt  man_sh_REDIRECT.txt  message.txt
% cat xxx > temp.txt
cat: xxx: No such file or directory
%

この場合,ファイル xxx が存在しないため,コマンド cat xxx に対し "cat: xxx: No such file or directory" というエラーが出力された訳です。

 ここで注意したいのは,上記の例から分かるように,出力のリダイレクト (>) を使っても,エラーメッセージ "cat: xxx: No such file or directory" は,ファイル temp.txt へ出力されず,そのまま標準出力(ターミナル)へ出力されていることです。すなわち,エラーは標準出力として出力されるのであり,更に,それは,パイピングを含め I/O Redirection の対象とはなっていないのです。このように,エラー出力は,通常の出力とは区別され,別途の出力対象として標準出力となっており,これを「標準エラー出力」(Standard Error Output) といいます。

 それでも,標準エラー出力をファイルへ出力したい場合があるかもしれません。その方法が「標準エラー出力のリダイレクト」です。

■標準エラー出力のリダイレクト

% command >& file