5 パイプ、リダイレクション等
Unix では、コマンドの標準入力 (stdin, 通常はキーボードからの入力)、
標準出力 (stdout, 通常は画面出力) をファイルに切り替えたり、
他のコマンドに渡すための仕組みがあります。
基本的には以下のように使います。
- command < file :
入力リダイレクション
(file の内容を command の標準入力とする)
- command > file :
出力リダイレクション
(command の標準出力を file に書き出す)
- command1 | command2 :
パイプ
(command1 の標準出力を command2 の標準入力とする)
これは、以下のように多段に組み合わせて使うことも可能です。
% com1 < file1 | com2 | com3 > file2
この場合、
- file1 の内容を標準入力として com1 へ渡し、
- その com1 の標準出力が com2 の標準入力へ渡され、
- その com2 の標準出力が com3 の標準入力へ渡され、
- その com3 の標準出力が file2 として保存される
ということになります。
上の com1, com2, com3 のように、標準入力からデータをもらい、
それを加工して標準出力に流すプログラムを フィルタ と呼びます。
Unix ではこの仕組みにより、
単一の仕事しかしない複数のフィルタを組み合わせて必要な多段階の加工を行う、
という作業がよく行われ、
そのための色々なフィルタが用意されています (4.5 節の外部コマンドの多くもその類いです)。
出力リダイレクションには、次のような別の形式もあります。
- command >> file :
file の最後へ追加出力 (> の場合は上書き)
- command >& file :
標準エラー出力 (stderr) も合わせて file に出力
- command >>& file :
標準エラー出力 (stderr) も合わせて file に追加出力
また、<< は、
ヒアドキュメント として使われます。
command << name
string
...
name
これは、name までの文字列の並びを command への標準入力として渡します。
一行の文字列なら、コマンド echo を使って
echo "string" | command
としても渡せるのですが、
ヒアドキュメントは複数行の文字列を渡すときに便利です。
name は渡す文字列内に現れない任意の文字列を使用できます。
name の代わりに 'name' とすれば
文字列部分の変数展開は行われません。
パイプ以外で、複数のコマンドを 1 行で連続実行することもできます2。
- com1 ; com2
: com1 の次に com2 を実行
- com1 && com2
: com1 が正常終了した場合のみ com2 を実行
- com1 || com2
: com1 が異常終了した場合のみ com2 を実行
3 つ以上を並べることも可能です。
これらの `;', `||', `&&' を含んだコマンド列を ( ) でくくると、
それ自体が一つのコマンドとみなされ、
それをまたコマンド列の要素とすることもできます。例:
com1 | ( com2 > file1 ; com3 file1 ) | com4
竹野茂治@新潟工科大学
2008年1月13日