UNIXのリダイレクト、パイプ

UNIXのリダイレクト、パイプ処理について。

標準入出力・リダイレクト・パイプ

UNIXのコマンド

 UNIXのコマンドには、ファイル名を指定して、その内容をさまざまに加工してその結果を出力するものが多くあります
例えば、ファイルの内容を並べ替えるsort コマンドなどがその代表です.
このコマンドは、

  1. 指定されたファイルから入力を行い
  2. 内容を順番に並べ替え
  3. 結果を画面に出力する

というものです.
 一般にUNIXのコマンドの多くは、このように、「何か入力を読み込み、それを加工して出力する.」ものです.
この様に、入力を加工して出力する形式のコマンドをフィルタ型コマンドといいます.

 unixのフィルタコマンドは、指定のファイルから入力を受け、加工の結果を画面の出力しますが、実は、unixにおいては、画面やキーボードなどという入出力装置も、一種のファイルとして扱います.
 つまり、unixのコマンドは、全ての入力を、ファイルから行い、全ての出力をファイルに対して行うように作られているのです.
キーボードからの入力は、一種の入力ファイルであり「標準入力」という名前のファイルからの入力とみなされます.画面への出力も、「標準出力」というファイルへの出力とみなすのです.そして、コマンドの引数として入力ファイルの名前が指定されたときには、そのファイルからの入力が行われ、引数が指定されないときには、キーボードから入力が行われるわけです.また、コマンドの引数として出力ファイルの名前が指定されたときにはそのファイルに出力が行われ、指定されないときには、画面に出力が行われるのです.unixにおいては、このように、ファイル名が指定されない場合に入力の行われるファイルのことを「標準入力」といい、出力ファイルのことを「標準出力」といいます.

(エラーが起こった場合のメッセージが、通常の標準出力と一緒に、ファイルなどに出力されてしまうと,その場でエラーの発生が分からないなど、不都合があるので、エラー出力だけは標準出力とは独立の出力として扱います.)

リダイレクト

 リダイレクトとは「入出力の切り替え」という意味です.これは、標準入力を、キーボード以外のファイルに指定したり、標準出力をディスプレイ以外のファイルに指定したりすることです.
 次の ls コマンドを用いてこの動作を説明します.ls コマンドはファイルリストを標準出力に出力しますが,なにも指定しなければ標準出力はディスプレイ画面なので、ファイルリストがそのまま画面に出力されます. この出力を、ファイルに切り替えるには次のようにします.

% ls > list1

このとき、画面には何も出力されず、代わりに list1 という名前のファイルが出来上がります.試しにこのファイルの内容を cat コマンドで表示してみると、ファイルリストが画面に出力されます。
このように、画面に出力されるはずのものが、ファイルになります.ここで使用した記号  が、「出力のリダイレクト」記号です.この記号は、標準出力への出力を、右側に指定した名前のファイルに切り替える記号です.

パイプライン処理

 リダイレクトを用いて結果をファイルにすることができますが、さらに、そのファイルに手を加えたい場合があります. 例えば、ファイルを並べ換え、その結果を1画面ずつに区切って出力するような場合には、次のようにすればできます。

% sort file1 > tmp1
% less < tmp1

ここで、 tmp1 というファイルは、sort の結果を一時的に保存するのに使用されている中間ファイルであって、それ以外の目的には使用されていませんから、終わってしまえば不要となるものです. ここでの動作を整理してみると、sort コマンドは、結果を標準出力に出力し、 less コマンドは、標準入力から入力を行っています.そこで、標準出力の結果をいったんファイルにするのではなく、直接に標準出力の出力を次のコマンドに送ってやれば、中間ファイルは不要になります. このような役割を果たすのが、パイプライン処理です.次のようにすると、中間ファイルを作ること無く、sort の結果を less の入力とすることができます.

% sort  file1 | less

"|" 記号は、左側のコマンドの標準出力を、右側のコマンドの標準入力に流すという動作を行います.  つまり、sort の結果は、右側にある "|" に受け渡され、画面に出力される代わりに、次のコマンドの入力に与えられます.  一方 less コマンドは左側に "|" があるために、標準入力からの入力を、キーボードやファイルからでなく、パイプラインから受け取ります.  このような連携プレーの結果、 file1 の内容が sort され、その後、一画面づつに区切られて出力されます.  パイプ処理は何段にも重ねることができます. afile ファイルの中から "log" を含む行を選び出し、順番に並べ換え、一画面づつに表示するには次のようにします.

% grep "log" file1 | sort | less

パイプライン処理の結果をリダイレクトによってファイルにすることもできます.

% grep "log" file1 | sort  > file1.log

 また、入力ファイル名を指定する代わりにリダイレクトによってファイルから入力することもできます.

% grep "log" < file1 | sort  > file1.log

 なお、パイプ記号 "|" の前後には空白を空けても空けなくても構いません.