ホーム » スタッフ » 斉藤徹 » リダイレクトとパイプ

2012年7月
« 6月   8月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

リダイレクトとパイプ

ファイルの話はほぼ終わったので、リダイレクトとパイプについて説明を行う。

標準入出力とリダイレクト

以下のプログラムは、先週バッファリングの説明のために示した、 入力の小文字を大文字に変換して出力するプログラム。 まずは、このプログラムを保存し、実行プログラム"upper.exe"を 起動し、バッファリングが使われていることを再確認。

#include <stdio.h>
int main() {
int c ;
while( (c = getchar()) != EOF ) {
if ( c >= 'a' && c <= 'z' )
c = c - 'a' + 'A' ;
putchar( c ) ;
}
return 0 ;
}

標準入力とは、通常キーボードに割り当てられているが、 通常のOSでは、入力をプログラム起動時にファイルに切り替えて実行することができる。

((コマンドプロンプトを開いて、))
((upper.c と同じディレクトリに入る。))
$ upper.exe
This is a pen.
THIS IS A PEN.
^C
$ upper.exe < upper.c
#INCLUDE
INT MAIN(){
:

ファイルに切り替えて実行するには、 "<"マークの後ろにキー入力の代わりのファイルを書けばいい。 この様な機能を"入力リダイレクト"と呼ぶ。

出力リダイレクト

同じように、通常ディスプレイに割り当てられているが、 プログラム起動時に出力を画面でなくファイルに保存するように実行するには、 ">"マークの後ろに保存先のファイル名を書けば良い。 このような機能を"出力リダイレクト"と呼ぶ。

((出力リダイレクト))
$ upper.exe > out.txt
This is a pen.
That is a pencil.
^C
$ type out.txt
THIS IS A PEN.
THAT IS A PENCIL.
((入力リダイレクトと出力リダイレクト))
$ upper.exe < upper.c > out.txt
$ type out.txt
#INCLUDE
:

出力リダイレクトの際に、">> ファイル名" を付けた場合は、 追記モードで書き込みが行われる。

$ echo "abc" > out.txt
$ type out.txt
abc
$ echo "def" >> out.txt
abc
def

パイプ

入力リダイレクトでは、標準入力をデフォルトのキー入力をファイル入力に 簡単に切り替えることができる。 同様に、出力リダイレクトでは、標準出力の画面を、ファイル出力に 簡単に切り替えることができる。 言い方を変えれば、キー入力や画面出力とファイル入出力を、 同じ概念で操作できる所が大きな特徴。 これと同じように、プログラムの出力と別のプログラムの入力も、 区別なく使うことができたらさらに便利ではないか?

((リダイレクトでabcdeを大文字変換))
$ echo "abcde" > out.txt
$ upper.exe < out.txt
ABCDE
((上記作業を一発で実行))
$ echo "abcde" | upper.exe
ABCDE

この例では、echo プログラムの出力をそのまま upper.exe の標準入力に渡し、 そのupper.exe の標準出力として、ABCDEが画面に表示されている。 プログラム起動時の"|"がパイプで、左側のプログラムの標準出力を 右側のプログラムの標準入力に渡している。

パイプの話の延長として、WebのCGIプログラムではパイプが使われていることや、 フィルタプログラムを組み合わせれば複雑なプログラムを書かなくていいなどを説明する。 また、フィルタプログラムでは、処理中に発生したエラーの警告をprintfで出力すると、 警告メッセージが次のプログラムに送られてしまい、確認ができなくなったり、 警告メッセージのデータを処理できなくなる。このために、標準エラー出力という ものがあることを説明する。