今号では、Linux における標準入力、標準出力、標準エラー出力について解説します!
標準入力・標準出力・標準エラー出力とは
標準入力とは、プログラムが使うデータを受け取るための読み込み元を意味します。
主な標準入力として、キーボードなどがあります。
標準出力とは、プログラムが使うデータの出力先を示します。
それに対して標準エラー出力とは、プログラムが使うデータのうち、エラーの出力先を意味します。
主な標準出力・標準エラー出力として、コンソール、ディスプレイなどがあります。
また、コマンド操作における標準入力・標準出力・標準エラー出力では、パイプライン、
リダイレクトという仕組みを使用することができます。
パイプライン
パイプラインとは、コマンドの出力を別のコマンドの入力として扱う仕組みです。
“|” で表現します。
例えば、text.txt というファイルの内容から grep コマンドで特定の文字列を抽出する場合、下記の様なコマンドを実行します。
# cat text.txt | grep aaa aaa
前提として、text.txt の内容は下記の通りです。
# cat text.txt aaa bbb ccc ddd eee
この時、cat text.txt にて出力された内容が “|” (パイプライン) を通じて grep コマンドに渡され、grep コマンドはその標準入力からデータを受け取っています。
リダイレクト
リダイレクトとは、コマンドの出力先を別の出力先 (ファイルなど) に変更することができる仕組みです。
“>” や “ で表現します。
- 標準出力のリダイレクト
例えば、ls コマンドでカレントディレクトリのファイル一覧を表示させた場合、結果をコンソールではなくファイルに出力する場合、下記の様なコマンドを実行します。# ls > /tmp/file.txt #
file.txt の内容は下記の通りとなります。
# cat /tmp/file.txt file1 file2 file3
- 標準エラー出力のリダイレクト
上記で解説した標準出力 “>” の場合、エラーとなる実行結果、つまり標準エラー出力はリダイレクトしません。
例えば、先ほどと同様に ls コマンドの実行結果を標準エラー出力のリダイレクト “2>” を使用してファイルに出力してみますが、出力先ファイルには何も記録されません。
代わりに、デフォルトの標準出力であるコンソールに実行結果が表示されています。# ls 2> /tmp/file.txt file1 file2 file3 # cat /tmp/file.txt #
では、ls コマンドで存在しないファイルを指定して実行した場合はどうでしょうか。
この場合、コンソールには何も表示されず実行結果が file2.txt にリダイレクトされたことが分かります。# ls file4 2> /tmp/file2.txt # cat /tmp/file2.txt ls: file4 にアクセスできません: そのようなファイルやディレクトリはありません
- 標準出力、標準エラー出力両方のリダイレクト
上記で解説した標準出力、標準エラー出力を両方同時にリダイレクトさせることもできます。
先ほどの 2通りの ls コマンドを下記の様にそれぞれ実行すると、いずれの場合も実行結果が各ファイルへ書き込まれた事が分かります。# ls > /tmp/file.txt 2>&1 # ls file4 > /tmp/file2.txt 2>&1 # cat /tmp/file.txt file1 file2 file3 # cat /tmp/file2.txt ls: file4 にアクセスできません: そのようなファイルやディレクトリはありません
- 標準入力のリダイレクト
パイプラインの章で解説した grep コマンドの実行例ですが、標準入力のリダイレクトを使用しても同じことができます。# grep aaa