5.1.3. コマンドの入力と出力/The input and output of commands

5.1.3.1. 入出力リダイレクション/input output redirection

コマンドを実行したときにターミナルに表示される内容を、ファイルに格納させるには、 出力リダイレクション(output redirection)を用いれば良い。コマンドと引数に続いて、 「> ファイル名」と指定する。:

$ ls *.c > source_file_names.txt

出力リダイレクトでは、プログラムの_標準出力_(standard output)をファイルに向けかえる。 特に指定をしなければ標準出力はターミナルになる。

プログラムによっては、標準出力に加えて、_標準エラー_(standard error)にも出力する ものがある。プログラムの通常の出力は標準出力に出すが、エラーや警告などのメッセージは 標準エラーに出されることが多い。その場合には、標準出力をリダイレクトした時であっても、 エラーメッセージだけは、リダイレクトされずに表示され、ユーザの目に止まる。

コンパイル結果のエラーメッセージをファイルに記録したい場合などには、標準出力と 標準エラー出力の双方を合わせてリダイレクトしたい場合がある。そのようなときには リダイレクト記号に「>&」を使う。:

$ make >& make.log

のようにすれば、プログラムのコンパイルを制御するmakeコマンドの標準出力と標準エラー 出力を合わせたものがmake.log というファイルに記録される。

標準出力と標準エラー出力をそれぞれ個別に制御する方法もあるが、一般的ではないので 説明は省略する。

プログラムがキーボードから入力を求める場合に、キー入力の代わりにファイルから 入力を読ませることができる。それが入力リダイレクション(input redirection)である。

入力リダイレクションには記号「<」を使う。:

$ generate_mesh_file < input_parameters.txt

などのように使う。

5.1.3.2. 入出力リダイレクションを使う時と、使わない時/When and when not to use redirection

出力リダイレクションを使うのは、プログラムが標準出力や標準エラー出力に何かを 出力している場合である。Cのプログラムで言えば printf() や fprintf(stderr,””) を 使っている場合、C++で言えば std::cout や std::cerr に対して出力を行っている場合である。

このようなプログラムは、ターミナルに出力されるように書かれているが、シェルの 指定によって、ターミナルに行くはずだった文字データを、ファイルにリダイレクト できるのである。

一方、プログラムの中でファイル名を指定してファイルに書いているような場合には、 出力リダイレクションを指定しても何も起こらない。C言語で言えばfopen(“ファイル名”)、 C++言語で言えば std::fstream を用いている場合である。

出力リダイレクションで指定したファイル名は、シェルで処理され、プログラムには 渡されない。:

$ generate_mesh_data > mesh.txt

と指定すると、「> mesh.txt」という指定はシェルが解釈する。 シェルがmesh.txtというファイルを作成して、標準出力がそこに向けられた状態を作り、 その上で generate_mesh_data というプログラムを実行する。 generate_mesh_dataの側には、引数は何も渡されない。出力リダイレクトが行われたことを 知らずに、単に出力するだけである。

これに対して:

$ generate_mesh_data mesh.txt

と書いた場合には、generate_mesh_dataに引数 mesh.txt が渡される。 この引数をどう解釈するか、例えばこの名前のファイルを作成してそこに出力を書き込む のか否かは、generate_mesh_dataの記述内容次第である。

引数としてファイル名を要求するプログラムに、入出力リダイレクトの記号をつけてしまうと、 ファイル名がプログラムに伝わらないので、注意しよう。

5.1.3.3. パイプ/Pipes

ひとつのプログラムの標準出力を、別のプログラムの標準入力につなげるのがパイプ(pipe) である。「|」または「|&」複数のコマンドを続けて書く。「|」を使うと標準出力だけが、 「|&」と書くと標準出力と標準エラーが合わさって、パイプの次段に送られる。

例えば:

$ make |& tee make.log

と書くと、makeコマンドの出力がエラーメッセージ込で、tee プログラムに送られる。 teeプログラムは、メッセージをターミナルに表示させつつ、ファイルにも記録を取る プログラムである。標準入力から読み込んだデータをそのまま標準出力に送り出すが、 それと同時に、引数に指定したファイルにも同じ内容を書き込む。

コンパイルメッセージがたくさん出る時に、とりあえず画面で流しつつ、後で確認できる ようにファイルにも残したいようなときに利用する。