標準入出力 4
リダイレクションとパイプの応用
今まで説明のために使ってきたputとgetというプログラムによって、
もう少し複雑な例を解説する。
- 標準出力と標準エラー出力を別々のファイルに書き出す。
このためにはサブシェルの機能を利用する。
ここでput > data1 >& data2
というコマンドではエラーになってしまうことに注意。
- 単にリダイレクションを使用するとdata1というファイルに標準出力からのデータが
書き出される。
# put > data1
stderr
#
- 上でウインドウに表示される標準エラー出力からのデータを別のファイルに
書き出すためには、上のリダイレクションを使ったコマンド全体をひとつの
コマンドのように扱えると良い。
そのためにサブシェルの機能を使う。
# ( put > data1 )
stderr
#
この様にコマンド全体を括弧で囲って実行すると、括弧の中のコマンドがひとつの
コマンドと同じ扱いができるようになる。
つまり、data1というファイルに標準出力のデータを書き出すひとつのコマンドになる。
- 後は標準エラー出力にstderrという文字列を出力するコマンド
( put > data1 )
からその出力をファイルに書き出せば良い。
# ( put > data1 ) >& data2
#
最終的にdata1, data2にそれぞれ標準出力、標準エラー出力からのデータを
別々に書き込むことができた。
- 標準エラー出力をファイルに書き出し、標準出力をそのままウインドウに出力する方法
これを実行するためには、ttyコマンドと
サブシェルの機能を利用する。
- まず、ttyコマンドによってコマンドを実行しているウインドウのデバイス名を調べる。
# tty
/dev/ttyq1
#
- コマンドの出力を上で調べたデバイスにリダイレクションで出力してやると
その出力は現在のウインドウに表示される。
(見た目の出力結果は変らない)
# put > /dev/ttyq1
stdout
stderr
#
- サブシェルの中で実行されたコマンドは、ひとつのまとまったコマンドのように実行できる。
(ここでもまだ見た目の出力結果は変らない)
# ( put > /dev/ttyq1 )
stdout
stderr
#
- サブシェルの括弧の中で実行されたコマンドからは標準エラー出力だけが
出力されている。
その出力をリダイレクションでファイルに書き込む。
# ( put > /dev/ttyq1 ) >& data
stdout
#
- リダイレクションとパイプは組み合わせて使うこともできる。
例えばputの標準出力からのデータをgetを通してファイルに書き込み、
標準エラー出力からのデータはgetを通した後ウインドウに出力するには
どうすれば良いか?
- 以下のように実行すると、dataというファイルにはput | getの
出力が書き込まれる。
# put | get > data
stderr
#
- このコマンド全体をサブシェルでひとつのコマンドにする。
# ( put | get > data )
stderr
#
- ウインドウに出力されているstderrをgetにパイプで送る。
# ( put | get > data ) |& get
get : stderr
#
例
上で説明されたコマンドをまとめてみた。
# cat put.c
#include <stdio.h>
main()
{
printf("stdout\n"); /* 標準出力へ出力される */
fprintf(stderr, "stderr\n"); /* 標準エラー出力へ出力される */
}
# cat get.c
#include <stdio.h>
main()
{
char s[128];
while(scanf("%s", s) == 1){ /* データの終りがきたらwhileループを終る */
printf("get : %s\n", s); /* 読み込んだ文字列にget : を付けて出力する */
}
}
# cc -o put put.c
# cc -o get get.c
# put
stdout
stderr
# get
test
get : test
Ctrl+d <- Ctrlキーとdキーを同時に押すとデータの終りになる
# ( put > data1 ) >& data2
# cat data1
stdout
# cat data2
stderr
# tty
/dev/ttyq1
# ( put > /dev/ttyq1 ) >& data
stdout
# cat data
stderr
# ( put | get > data ) |& get
get : stderr
# cat data
get : stdout
#
参考
Prev
Home | Contents
abe@injapan.net