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

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

今回はteeコマンドを説明します。

teeコマンドをあるコマンドとパイプで接続することで、
あるコマンドの実行結果をファイルと標準出力に同時に出力することができます。

teeコマンド

≪書式≫
$ tee ファイル名  …  標準入力(FD0番)から受け取ったデータをファイルと標準出力(FD1番)に出力する。

≪記述例≫
$ ls | tee result.txt  …  lsコマンドの実行結果がファイル「result.txt」と標準出力(FD1番)に出力される。

記述例の動作イメージは下記の通りです。
lsコマンドのFD1番とteeコマンドのFD0番がパイプを介して接続され、
lsコマンドの実行結果がteeコマンドに渡されます。
teeコマンドは受取ったデータをファイル「result.txt」とFD1(標準出力)に出力します。


この他、teeコマンドを一連の処理を構成するコマンドとコマンドの間に入れることで、
処理の途中経過を知ることもできます。


リダイレクトとパイプに関するまとめは、これで終わりです。

リダイレクトとパイプは、イマイチわかり難いという話をよく耳にしますが、
動作をイメージして取り組めば意外と簡単に理解できるようになる思います。


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

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

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

前回と前々回でリダイレクトとパイプについて説明しました。

今回は複数のリダイレクト、あるいはリダイレクトとパイプを組み合わせた場合についてまとめます。
リダイレクトやパイプの細かい説明は繰り返しになるので省略します。

Case1 : $ コマンド > out_file.txt 2>&1

まず「 > out_file.txt」により、コマンドのFD1番がファイル「out_file.txt」にリダイレクトされます。

次に「 2>&1 」で、FD2番がFD1番と同じファイル「out_file.txt」にリダイレクトされます。

結果として、ファイル「out_file.txt」にはコマンドの標準出力と標準エラー出力が記録されます。

Case2 : $ コマンド 2>&1 > out_file.txt

このケースはCase1のリダイレクトの順番を入れ替えたものです。 この場合、まず「 2>&1 」により、FD2番がFD1番と同じ標準出力にリダイレクトされます。


そして、「 > out_file.txt 」でFD1番が標準出力からファイル「out_file.txt」にリダイレクトされます。

結果として、「out_file.txt」にはコマンドの標準出力のみ記録され、コマンドの標準エラー出力は端末画面に表示されます。

Case3 : $ コマンド < in_file.txt > out_file.txt

まず「 < in_file.txt 」により、コマンドのFD0番が標準入力からファイル「in_file.txt」にリダイレクトされます。 そして「 > out_file.txt」により、FD1番が標準出力からファイル「out_file.txt」にリダイレクトされます。


結果として、「out_file.txt」にはコマンドの標準出力のみ記録され、コマンドの標準エラー出力は端末画面に表示されます。

Case4 : $ コマンド < in_file.txt 2>&1

まず「 < in_file.txt 」により、コマンドのFD0番が標準入力からファイル「in_file.txt」にリダイレクトされ、 次に「 2>&1 」で、FD2番がFD1番と同じ標準出力にリダイレクトされます。


Case5 : $ コマンドX 2>&1 | コマンドY

順を追って説明します。
まず最初に、「 2>&1 」によりコマンドXではFD2番がFD1番と同じ標準出力にリダイレクトされます。

次に、「 | 」でコマンドXの標準出力を参照している全てのFDと、コマンドYのFDOがパイプにリダイレクトされます(図3-2)。
コマンドXで標準出力を参照している全てのFDが、パイプにリダイレクトされる点に注意が必要です。

結果として、コマンドXの標準出力と標準エラー出力がコマンドYの標準入力に渡されます。

Case6 : $ コマンドX < in_file.txt 2>&1 | コマンドY

もはや説明は不要だと思いますが、 コマンドXでは「 < in_file.txt」によりFD0番が標準入力からファイル「in_file.txt」にリダイレクトされ、
「 2>&1 」でFD2番がFD1番と同じ標準出力にリダイレクトされます。
そして最後に、「 | 」でコマンドXのFD1番およびFD2番と、コマンドYのFD0番がパイプにリダイレクトされます。


結果として、コマンドXの標準出力と標準エラー出力がコマンドYの標準入力に渡されます。

次回はteeコマンドについてまとめます。

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

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

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

前回は標準入出力のリダイレクトについてまとめました。
今回はパイプについてまとめます。

パイプ

パイプは前のコマンドの標準出力を次のコマンドに標準入力として渡します。
パイプを利用するには演算子 " | " を使います。

演算子 " | "

≪書式≫
$ コマンドX | コマンドY  ・・・  コマンドXの標準出力をコマンドYに標準入力として渡す。

≪記述例≫
$ ls -a | grep target ・・・  lsコマンドの実行結果をgrepコマンドに渡す。
                           grepは実行結果の中から「target」が含まれる行を表示する。

記述例の動作をイメージ図にすると次のようになります。
図中のコマンドXがlsコマンド、コマンドYがgrepコマンドに相当します。





ここでは2つのリダイレクトが行われています。
- コマンドX : FD1番が標準出力から書込みモードで開かれたパイプにリダイレクトされます。
- コマンドY : FD0番が標準入力から読込みモードで開かれたパイプにリダイレクトされます。
これによりコマンドXの標準出力がパイプを通してコマンドYに標準入力として渡されるようになります。



次回は、複数のリダイレクトを組み合わせた場合、
リダイレクトとパイプを組み合わせた場合についてまとめます。

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

【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)

はじめましてhorus531です。

Linuxにはあまり詳しくないのですが、
仕事の都合でLinuxサーバの運用・管理をしています。

ここでは備忘録として、
日々の運用の中で得た知識を記していこうと思います。

間違いなどがあれば、どんどん指摘してください。