28.2 リダイレクション

リダイレクションについて簡単に学びます. プログラムはなんらかの文字列を出力することがあります.例えば promptls return2 とすれば,今のディレクトリにあるファイル一覧という文字列が出力されます.またパイプで学んだように, more コマンドは,別のコマンドの出力を入力として受け取って処理しました.

この入力元や入力先(それぞれ標準入力, 標準出力といいます.)をファイルに変更することができます.これをリダイレクション,あるいはリダイレクトと呼びます.

例えば, 漢字コードを変換する nkf というプログラムを考えます. nkf は, promptnkf -e filename return2 で filename というファイル名をもつファイルを日本語EUCに変換します. promptnkf -j filename return2 ならば filename という名前のついたファイルをJISコードに変換して, 標準出力に出力します.

promptnkf -e memo.jis return2

と入力したとしましょう. memo.jis(JISコードで書かれているとします) が 日本語EUC に変換された結果が,画面にどんどん書き出されていきますが, memo.jis というファイルそのものが変更されるわけではありません. 標準出力が画面だからです. 日本語EUCに変換されたファイルを作るためには, リダイレクションを利用して,

promptnkf -e memo.jis > memo.euc return2

などとしてやります. 不等号の大なり(>)のあとにファイル名を書くことによって, 標準出力がそのファイル名を持ったファイルとなります.

>」の場合には, ファイルを新たに作って, そのファイルの中に結果を書き込むことになります, もともと memo.euc というファイルが既に存在していた場合はそのファイルの内容は失われるので注意しましょう.

hello という5文字の内容をもつファイル, aisatu.txt を簡単に作りたいという場合は promptecho return2 の出力先をファイルにすることで実現できます.

promptecho hello > aisatu.txt return2

出力結果をすでにあるファイルに追加することもできます.

promptecho konnichiha >> aisatu.txt return2

のように, 「>>」を使うと, aisatu.txt の内容は, 既にあった aisatu.txt のファイル内容の最後に, 今回の出力結果が加わったものになります.

promptcat aisatu.txt return2 hello konnichiha

リダイレクションと前項で習ったパイプを組み合わせることができます.

promptnkf -e memo.jis | a2ps > memo.ps return2

とすると, 文字コードが日本語EUCに変換された上に, さらに PostScript に変更された memo.ps というファイルができます.

最後に,パイプとリダイレクションの違いをまとめておきましょう.

パイプあるプログラムの出力を別のプログラムの入力にする.
リダイレクションあるプログラムの入力,出力を(端末画面から)ファイルに変更する.

caution ここでの説明は bash だけでなく, csh,tcsh などでも成り立ちます.