【bash】リダイレクトとパイプを理解する(1)
普段なにげなくリダイレクトやパイプを使っていますが、勉強を兼ねてまとめてみます。
※長くなりそうなので適当に複数回に分けます。
標準入出力
標準入出力とはコマンドに与えられた、データストリーム入出力に関するインターフェースのことです。
標準入出力には以下の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)