3,パイプラインでファイルサーフィン

UNIXの非常に優れた機能の一つとして、パイプラインが上げられる。その前に、これと似た機能にリダイレクトという機能がある。
多くのプログラムはその結果を端末に文字として表示する機能を有している。たとえば

ls

と入力すると

foo bar hoe hoge

と、ファイル名を端末に表示する。このことを別の見方をすると、端末には表示するデータをプログラムからどんどん送り込んでもらうための受け口が付いていて、プログラムはその受け口に向かってどんどんデータを送り込んでいる、とも考えられる。そこで、指定されたファイル名のファイルに受け取ったデータを書き込むための受け口を作っておいてプログラムにデータをどんどん送り込んでもらえば、今まで端末で見ていた文字列をファイルに格納することができる。これがリダイレクトである。実際には

ls > file1

とプログラムと出力するためのファイルを">" でつないでやる。するとfile1 という名前のファイルができる。このファイルの中身を見ると

foo bar hoe hoge

と、先ほどのlsの結果が格納されていることがわかる。
さて、これをさらに発展させてみよう。プログラムにあるファイルの内容を見て加工をしてその結果を端末に文字列などとして出力するものがある。つまり何かの入力を加工して何かの出力をするというものである。この入力を、ファイルの中身だけでなく、端末から人が入力したものや、他のプログラムの出力など、何でも放り込める受け口になるように改造してやる。あるプログラムが出力したものを、別のプログラムの受け口に送り込んでやって、そのプログラムが吐き出した出力を又別のプログラムの受け口に送り込んでやって・・・というのが、パイプラインのごく簡単な仕組みである。

foo
bar
tuyoshi
aho

という中身のファイルfile2 があったとしましょう。そして

cat ・・・ファイルの中身を表示する
sort・・・行単位で並び替える
lpr ・・・プリンターに出力する

というプログラムがあったとしましょう。これらをパイプラインで結ぶと

cat file2 | sort | lpr

とコマンドを入れるとfile2 の中身が行単位でソートされてプリンターに出力されます。
さて、このプログラムや端末の受け口を「標準入力」といいます。標準入力は通常端末が使われます。つまりあるプログラムの受け口の先を特に指定しなければキーボードの入力を処理するようになります。標準入力をファイル名にかえるとそのファイルを処理します。そして、ある入出力装置(テープとか、RS232Cとか)を擬似的にファイルと見なしたデバイスファイルを指定すると、その入出力装置から次々に送り込まれるデータを処理します。
UNIXはキーボード端末で処理することが多いのですが、パイプラインは仕事を助けるツールになります。



今日の「ほー」
cpというファイルをコピーするコマンドはコピーしたファイルの所有者をそのコマンドを実行した人のものにしてしまいます。しかし、管理者がユーザーのファイルを他の場所に一度に写したいときにはこのことが面倒を起こします。そんなときは

tar cvf - "files" | (cd "dir" ;tar xvfp -)

で解決です。このときfiles は相対パスを使います。またcd "dir"を必ず行わないとたいへんなことになるでしょう。