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