今回は標準出力と標準エラー出力について解説します。それとインフラエンジニアであれば一度は出あったことがある、2>&1の意味について理解しましょう。
標準出力と標準エラー出力
コマンドを実行したときにエラーが発生することがあります。たとえば次の例では、catコマンドで存在しないファイルを指定しています。catコマンドでは、aaaというファイルを探して、そのようなファイルがなかったというエラーメッセージを出力しています。
$ cat aaa
cat: aaa: No such file or directory
このようなエラーを伝えるためのメッセージは標準出力ではなく、「標準エラー出力」に出力されるようになっています。標準エラー出力も標準出力と同様、特に指定していないときには端末が利用されます。そのため一見すると、標準出力に出力された場合と区別がつきません。しかし、標準出力をリダイレクトすると、それらが独立していることがわかります。
次の例では、先ほどの標準出力をbbb.txtにリダイレクトしています。
$ cat aaa > bbb.txt
cat: aaa: No such file or directory
bbb.txtを開いてみましょう。
$ cat bbb.txt
$ ←何も表示されない
何も表示されませんね。これにより cat: aaa: No such file or directory は標準入力ではなく、標準エラー出力であることが分かります。
標準出力と標準エラー出力が分かれているメリット
今までの話から、標準出力と標準エラー出力が分かれている意味はなんだろう?と思われるかもしれません。これは例えばスクリプトの実行時などをイメージすると分かりやすいと思います。次の例ではaaa.shの実行結果をbbb.logに書き込んでいます。
$ ./aaa.sh > bbb.log
このとき実行の結果、エラーが発生した場合、端末にエラーが表示されることになります。
$ ./aaa.sh > bbb.log
cat: aaa: No such file or directory
なぜなら、標準出力はすべてbbb.logにリダイレクトされますが、標準エラー出力はリダイレクトされていないからです。これによりスクリプト実行時にエラーが発生した場合はエラーに気づくことができます。
標準エラー出力も含めてリダイレクトしたい場合
ただ、cronで定期的にスクリプトを実行してその結果をログに出力する場合などは標準エラー出力も含めてログにリダイレクトしたいでしょう。この場合は、
$ cat aaa > bbb.txt 2>$1
のように、2>&1を後ろにつけます。2は標準エラー出力を表し、1は標準出力を表します。2>&1で標準エラー出力を標準出力にリダイレクトするという意味になります。
次の例は、前出のコマンドの標準エラー出力を標準出力にリダイレクトしています。さらに標準出力は、bbb.txtにリダイレクトしています。
$ cat aaa > bbb.txt 2>&1
$ ←なにも表示されない
標準エラー出力が表示されませんね。これは標準エラー出力が標準出力にリダイレクトされているからです。証拠にbbb.txtを開いてみましょう。
$ more bbb.txt
cat: aaa: No such file or directory
正常にリダイレクトされていることが確認できました。