標準エラー出力

Unixでは、 それぞれのプログラムから 特にファイルを使う宣言をしなくても使える入出力先として、 標準入力、標準出力 のほかに、標準エラー出力というものが用意されている。

たとえば、フィルター型のプログラムで、結果はファイルに出したいが、 計算がうまくできないときのエラーメッセージは端末に出したいことがある。 この場合、結果は標準出力に、エラーメッセージは標準エラー出力に出すよう にプログラム(仮に名前をprogramとしよう)を作っておき、

% program > outfile
のように実行すれば、結果は (この例の場合outfileという名前の)ファイルに 書かれるが、エラーメッセージは端末画面に出る。

エラーメッセージも結果といっしょにファイルにとりたいのならば、 Cシェルのもとでは、

% program >& outfile
のような形で実行すればよい。 (出力先を示す不等号に続く & マークは エラー出力をも「リダイレクト」(redirect)する、つまりそこに 指定したファイルに向けることを示す。バックグラウンドジョブの指定 とは同じ文字だが意味は別である。)

標準出力と標準エラー出力を別のファイルに書くようにすることも 可能ではあるが方法が複雑なのでここでは省略する。

プログラム言語での書き方

C

C言語はUnixとともに発達したので、標準エラー出力の使い方はC言語では しっかり決まっている。stderrというファイル変数が、あらかじめ (stdio.hで)定義されているので、

  fprintf(stderr, 出力したい文字列);
の形で使えばよい。

Fortran

標準エラー出力はFortran言語の標準としては決まっていないが、 g77やDEC Fortranでは、WRITE文の入出力装置番号のところを「0」にすれば よい。 (なお、標準入力では「*」または5、標準出力では「*」または6である。)

Pascal

標準エラー出力は言語の標準としては決まっていない。 DEC Pascalのマニュアルによれば、errというファイル変数が この目的のためにあらかじめ定義されている。 ただし、outputとは違い、 ファイル変数(TEXT型)として宣言をし、 しかも、rewrite手続きを使ってファイルを開いておく必要がある (例文hensa1.p参照)。

(なお、ファイル変数(TEXT型)としてerrを宣言し、 あらかじめ端末(/dev/tty)に割り当てておくこともできる。 ただしこの場合、標準エラー出力を使っているわけではないので、 >& によるリダイレクションはできない。)

プログラム例

フィルター型のプログラムの例文 のうち、配列を使った例である hensa.{p,f,c} を、 配列の寸法をはみ出すような場合はその前にエラーメッセージを出して止める ように修正したものを、

として用意した。 なお、これらの例文では、配列の寸法 ndim (Cでは大文字)を、 kion.tokyoame.tokyo の行数よりも少なくしてあるので、これらのデータを読ませれば 用意したエラーメッセージが出るはずである。


1996-09-05; 2000-06-28; 2002-07-11
増田 耕一 (MASUDA Kooiti)

[目次へ]