[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

I/O リダイレクション

シェルの入出力リダイレクションについて、基本的なこと、 とくに標準入力、標準出力、標準エラーがどういうものかを、読者はよく御存じだと思う。 要するに、標準入力とは、データの入力元、すなわち、データがそこからやって来る場所のことだ。 データの入力元が、ディスク上のファイルだろうと、キーボードだろうと、磁気テープだろうと、 それどころかパンチカード・リーダーだろうと、プログラムはそれを知る必要もなければ、気にかける必要もない。 同様に、標準出力とは、データの溜まる場所、データがそこに行く場所のことだ。 プログラムとしては、それがどこになろうと、知らなくてもよく、気にかけなくてもよい。 標準入力からデータを読み込み、それに対して何らかの処理を行い、標準出力に送り出すだけのプログラムを、 水道のパイプラインのフィルターになぞらえて、「フィルター (filter)」と呼ぶ。

Unix のシェルでは、データのパイプラインを作るのはとてもやさしい。

 
program_to_create_data | filter1 | ... | filterN > final.pretty.data

ここでは、まず最初に生のデータを作成している。 各フィルターがそのデータに対して何らかの変形を次々に行い、 最終的に、データが希望どおりの形になって、パイプラインから抜け出してくる。

標準入力と標準出力については、それでよい。 では、標準エラーはどこで登場し、どんな役割を果たすのだろうか? 上記パイプラインの filter1 について考えてほしい。 データを読んでいるうちにエラーが起きたら、どうなるだろうか? filter1 がエラーメッセージを標準出力に書き出したら、 そのメッセージはパイプラインを下って filter2 の入力に飲み込まれてしまう。 そうなると、ユーザはたぶんメッセージをまったく目にしないことになるだろう。 そこで、プログラムとしては、ユーザがエラーメッセージに気がついてくれるように、 それを送ることのできる場所が必要になる。それが、標準エラーなのであり、 標準エラーは通常、現在使用しているコンソールやウィンドウに結びついている。 プログラムの標準出力を使用中のスクリーン以外にリダイレクトしている場合でも、それは変わらない。

フィルター・プログラムが協力し合うためには、データのフォーマットについて互いに合意している必要がある。 最も素直で使いやすいフォーマットと言えば、何と言っても、行分けされたテキストだ。 そして、Unix のデータファイルは、たいていの場合、まさに、ASCII LF (Line Feed) 文字によって行分けされたバイトの連続なのである。なお、この LF 文字は、Unix の文書では「改行 (newline)」と呼ばれる習慣になっている (C のプログラマにとっては \n だ)。これこそ、すべての伝統的なフィルター・プログラムによって使用されて来たフォーマットである。 (昔のオペレーティング・システムの多くは、バイナリ・データを扱うための複雑な手段や専用のプログラムを備えていた。 だが、Unix は、ただ単にテキストエディタでデータを見たり編集できたりする方がはるかに簡単だという考えから、 そうした道具をずっと敬遠してきたのである。)

さて、前置きはこれくらいで十分だ。まず、道具のいくつかをざっと見てみよう。 その後で、そうした道具をおもしろいやり方で組み合わせる方法をご覧に入れる。 以下の解説では、当面の問題に関係のあるコマンドライン・オプションしか取り上げない。 いつでもそうすべきことだが、コマンドについて詳しいことを知りたかったら、 ご使用のシステムの文書を参照なさるとよい。


This document was generated on August 15, 2017 using texi2html 1.82.