SFC CNS GUIDE 2004

4.14 入出力のリダイレクションとパイプ

通常,コマンドはキーボード (標準入力) から入力され, 結果は画面 (標準出力) に出力されます. しかし,コマンドの実行結果を利用して次の処理をするときに, 実行結果をファイルや次のコマンドに出力できれば効率的に作業を行えます. シェルは ``リダイレクション'' と ``パイプ'' という コマンドの入力や出力を切り替える機能をもっています.

4.14.1 リダイレクション

リダイレクションは, ファイルの内容を標準入力として使用したり, 標準出力の内容をファイルに書き込むための機能です. リダイレクションを利用することによって, ファイルの内容をコマンドに入力したり, コマンドの実行結果をファイルに書き込めます. リダイレクションには, `<' や `>' を用います.

4.14.1.1 リダイレクションを用いた入力

ファイルからデータを読み込んでコマンドに実行させるには, すなわちファイルの内容を標準入力として使う場合 `<' を用います. `<' の左側に実行するコマンドを, 右側にそのコマンドに入力するファイルの名前を指定します.

[実行するコマンド] < [ファイル名]

4.14.1.2 リダイレクションを用いた出力

コマンドの結果をファイルに出力するには, `>' を利用します. `>' を 利用したリダイレクションには次の3つの書式があります.

[コマンド] >  [出力するファイル名]
[コマンド] >> [出力するファイル名]
[コマンド] >& [出力するファイル名]

1つめの `>' はコマンドの処理結果をファイルに上書きします. そのため, 同じ名前のファイルが存在する場合には, 以前の内容は消去されてしまいます.

それに対して, 2つめの `>>' はコマンドの処理結果を, 指定したファイルの末尾に書き加えます.

3つめの `>&' はコマンドの標準出力に加えて, 標準エラー出力をファイルに上書きします. これはエラーメッセージな どをファイルに出力する場合などに利用します.

次の例では, ls ([*]) コマンドの出力結果を `result' というファイルに書き込んでいます. なお `>' を利用した場合, コマンドの実行結果はファイルに出力されます.

% ls <ENTER>                  ← lsコマンドを実行してカレントディレクトリのファイルを表示 
report.tex      proposal.gif 
% ls > result <ENTER>         ← lsコマンドの結果を`result'というファイルに格納
% cat result <ENTER>          ← `result'というファイルの中身を読む
report.tex      proposal.gif
% _
注意 コマンドの入力と出力先に同じファイル名を指定してはいけません. 同じファイル名を指定するとファイルの内容が失われてしまいます. リダイレクションによる 上書きを防止するときには, あらかじめシェルで `set noclobber' と入力しておきます.

4.14.2 パイプ

パイプは,ある1つのコマンドの標準出力を 次のコマンドの標準入力として使用する際に利用します.

次の例では, `ls -l' の標準出力を次の lessコマンド ([*]) の標準入力として利用しています. こうすることで, lsコマンドの出力が1画面以上の長さにわたる場合でも, 1画面ごとに止めて見られます.

% ls -l | less <ENTER>
total 170
-rw-r--r--  1 t00000tf  student   8963  1  6 10:51 01report.tex
-rw-r--r--  1 t00000tf  student  14413  1  6 10:51 02report.tex
-rw-r--r--  1 t00000tf  student  13680  1  6 10:51 03report.tex
-rw-r--r--  1 t00000tf  student  71738  1  6 10:51 04report.tex
-rw-r--r--  1 t00000tf  student  21617  1  6 10:51 05report.tex
-rw-r--r--  1 t00000tf  student   8725  1  6 10:51 06report.tex
-rw-r--r--  1 t00000tf  student   2040  1  6 10:51 kadai.tex
-rw-r--r--  1 t00000tf  student    176  1  6 10:48 mymemo.txt
drwxr-xr-x  2 t00000tf  student    512  1  6 11:28 privateFile/
-rw-r--r--  1 t00000tf  student  25819  1  6 10:51 reserch.tex
:_

パイプは2つ以上のコマンドをつなぎ合わせられます. なお, パイプの後に `&' をつけると, コマンドの標準出力だけでなく標準エラー出力も 次のコマンドの入力として利用できます (表4.4).

[コマンド1] | [コマンド2]

表 4.4: パイプの種類
記号 意味
| 標準出力のパイプ
|& 標準出力と標準エラー出力のパイプ
Valid CSS! Valid HTML 4.01!