リダイレクトとパイプ

リダイレクトとパイプによって,入力や出力の流れを制御することができる.
リダイレクトとは
標準ファイルディスクリプタ
ファイルへの追加書き込み
パイプ

リダイレクトとは

プロンプトからコマンドを実行したとき,多くの場合はディスプレイに出力される.こととき標準出力はディスプレイになっている.コマンドの実行結果を例えばhogeというファイルに出力したいときは,以下のようにする.
command > hoge
これは,標準出力をファイルhogeに指定している.標準出力だけでなく,標準エラー出力や標準入力も切替えることができる.これがリダイレクトである.

標準ファイルディスクリプタ

ファイルディスクリプタとは,プログラムがファイルやデバイスにアクセスする際に使用する整数である.標準ファイルディスクリプタを以下に示す.
0 : 標準入力
1 : 標準出力
2 : 標準エラー出力
先の例は以下と等価である.
command 1> hoge
標準エラー出力をファイルhogeにリダイレクトする場合は,以下のようにする.
command 2> hoge
標準出力と標準エラー出力をファイルhogeにリダイレクトする場合には,以下の二つの方法がある.
command > hoge 2>&1
command &> hoge
前者は順番が重要で,2>&1は「標準エラー出力を標準出力と同じものにリダイレクトする」という意味である.したがって,2>&1を指定した時点での標準出力先が標準エラー出力になる.つまり,以下の両者は結果が異なる.
command > hoge 2>&1
command 2>&1 > hoge

ファイルへの追加書き込み

command > hoge
上の例では,ファイルhogeの内容はcommandの標準出力のみである.hogeが既存のファイルで何か書かれていたとしてもそれは消えてしまう.ファイルに追加書き込みした場合はいかのようにする.
command >> hoge

パイプ

今まではあるプロセスの実行結果をファイルにリダイレクトする方法を示した.あるプロセスの実行結果を別のプロセスの入力にリダイレクトすることもできる.
command1 | command2
command1の出力はcommand2に入力として渡される.これがパイプである.演算子は上の例にあるように|である.
command2はcommand1の終了を待たずに開始される.command1から必要な入力を渡され次第,command2は実行される.以下に例を示す.
mkisofs -R -nobak hoge | cdrecord dev=$cdrbus -data -eject -v speed=0 –
mkisofsはCDRに書き込むためのisoイメージを作成する.cdrecordはCDRにisoイメージを書き込む.cdrecordの最後のパラメータ「-」は標準入力をメディアに書き込むという意味である.ここではパイプを通って流れて来るmksiofsの出力(isoイメージ)がcdrecordの標準入力である.cdrecordはisoイメージが完成するのを待たずに,isoイメージの出来上がった部分から随時メディアに書き込んで行く.

This article was written by Fujiko