【bash】リダイレクトとパイプを理解する(1)

次回:【bash】リダイレクトとパイプを理解する(2)

普段なにげなくリダイレクトやパイプを使っていますが、勉強を兼ねてまとめてみます。
※長くなりそうなので適当に複数回に分けます。

標準入出力

標準入出力とはコマンドに与えられた、データストリーム入出力に関するインターフェースのことです。
標準入出力には以下の3つがあります。


名前デフォルトファイルディスクリプタ(FD)
標準入力キーボード0
標準出力画面1
標準エラー出力画面2

標準入力はコマンドへの入力ストリームで、キーボードからの入力です。
標準出力はコマンドからの出力ストリームで、エラー関係以外のメッセージを端末画面に出力します。
標準エラー出力は標準出力と同様にコマンドからの出力ストリームですが、
エラー関係のメッセージを端末画面に出力する点が異なります。

ファイルディスクリプタ(FD)

FDはコマンドが外部リソースと通信するためのインターフェースで、
内部に通信する外部リソースへの参照情報と、 0以上の整数値である識別子を持っています。

標準入出力へのFDはあらかじめ用意されており、
標準入力にはFD0番、標準出力にはFD1番、標準エラー出力にはFD2番、
がそれぞれ割り当てられています。

コマンドはこれらFDを介して標準入出力にアクセスします。

リダイレクトしない場合の、コマンドと標準入出力の関係をイメージ図にすると次のようになります。

リダイレクト

リダイレクトとは「FDの参照先を変更する操作」です。
よく「標準出力のりダイレクト」や「標準エラー出力のリダイレクト」と表現しますが、
標準出力や標準エラー出力そのものを操作するわけではありません。

標準出力と標準エラー出力のリダイレクト

標準出力と標準エラー出力のリダイレクトとは、FD1番とFD2番のリダイレクトのことです。
標準出力と標準エラー出力では2種類のリダイレクトがよく使われます。
1つは出力先をファイルにするリダイレクトで、
もう1つは出力先を他の標準出力または標準エラー出力の出力先と同じにするリダイレクトです。

1.出力先をファイルにリダイレクトする

出力先をファイルに変更するには、リダイレクト演算子 " > " または " >> " を使います。

≪書式≫
$ コマンド [n]> ファイル名  ・・・  ファイルを書き込みモードで開き、
                                 コマンドのFD n番の出力先に設定(リダイレクト)する。
                                 ファイルは出力内容で上書き保存される。 
  ※[n]:リダイレクトするFD番号。
         省略した場合、FD1番(=標準出力)がリダイレクトされる。

≪記述例≫
$ ls > result1.txt  ・・・  FD1番(標準出力)の内容がresult1.txtに上書き保存される。
$ ls 2> result2.txt ・・・  FD2番(標準エラー出力)の内容がresult2.txtに上書き保存される。

最初の記述例「$ ls > result1.txt」の動作をイメージ図にすると次のようになります。
FD1番の参照先が、標準出力から「result1.txt」にリダレクトされています。


≪書式≫
$ コマンド [n]>> ファイル名  ・・・  ファイルを書き込みモードで開き、
                                  コマンドのFD n番の出力先に設定(リダイレクト)する。
                                  出力内容はファイルに追記保存される。 
  ※[n]:リダイレクトするFD番号。
         省略した場合、FD1番(=標準出力)がリダイレクトされる。

≪記述例≫
$ ls >> result1.txt  ・・・  lsコマンドの標準出力の内容がresult1.txtに追記保存される。
$ ls 2>> result2.txt ・・・  lsコマンドの標準エラー出力の内容がresult2.txtに追記保存される。

イメージ図は先ほどと同じなので省略します。



2.出力先を他のFDと同じ出力先にリダイレクトする
出力先を他のFDと同じ出力先にリダイレクトするには、リダイレクト演算子 " >& " を使います。

≪書式≫
$ コマンド n>&m ファイル名  ・・・  コマンドのFD n番をFD m番と同じ出力先にリダイレクトする。
  ※n:リダイレクトするFD番号。
    m:リダイレクト先のFD番号。

≪記述例≫
$ ls 2>&1  ・・・  lsコマンドの標準エラー出力を標準出力と同じ出力先にリダイレクトする。
$ ls 1>&2  ・・・  lsコマンドの標準出力を標準エラー出力と同じ出力先にリダイレクトする。

最初の記述例「$ ls 2>&1」の動作をイメージ図にすると次のようになります。
FD2番の参照先が、標準エラー出力からFD1番とおなじ標準出力にリダレクトされています。

標準入力のリダイレクト

標準入力に関するリダイレクトとは、FD0番のリダイレクトです。 標準入力に関するリダイレクトでは、入力元をファイルにするリダイレクトがよく使われます。
※本当はヒアドキュメントもあるのですが省略します。

1.入力元をファイルにリダイレクトする

≪書式≫
$ コマンド [n]< ファイル名  ・・・  ファイルを読込みモードで開き、
                                 FD n番の入力元をファイルに設定(リダイレクト)する。
  ※[n]:リダイレクトするFD番号。
         省略した場合、FD0番(=標準入力)がリダイレクトされる。

≪記述例≫
$ echo < data.txt  ・・・  FD0番(標準入力)がdata.txtにリダイレクトされ、
                        その内容がechoコマンドによって表示される。

記述例の動作をイメージ図にすると次のようになります。
FD0番の参照先が、標準入力から「data.txt」にリダレクトされています。


次回はパイプについてまとめます。
次回:【bash】リダイレクトとパイプを理解する(2)