このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:標準出力と標準エラー出力をまとめる

標準出力と標準エラー出力をまとめる

 Linuxでコマンドを実行する際、標準出力標準エラー出力を別々にリダイレクトすることができます。しかし、これらを一つのファイルにまとめてリダイレクトしたい場合があります。これは、コマンドの実行結果とエラーメッセージを一つのログファイルに保存して、後でまとめて確認したいときなどに非常に便利です。

標準出力と標準エラー出力をまとめてリダイレクトする方法

【書式】
[コマンド] > [ファイル] 2>&1

  • >:標準出力を指定したファイルにリダイレクトします。
  • 2>&1:標準エラー出力(ファイルディスクリプター2)を、標準出力(ファイルディスクリプター1)と同じ場所にリダイレクトします。

ファイルディスクリプターの対応表

入出力チャネルファイルディスクリプター
標準入力 (stdin)0
標準出力 (stdout)1
標準エラー出力 (stderr)2
ファイルディスクリプターの対応表

 Linuxの内部では、各標準入出力が上記のような数値(ファイルディスクリプター)で管理されています。

使用例

例:ls コマンドで存在しないファイルを参照し、その結果とエラーメッセージを一つのファイルに保存する

user01@ubuntu:~$ ls non_exist.txt > result.txt 2>&1

解説

  • 標準出力をリダイレクト
    > を使用して、標準出力を result.txt ファイルにリダイレクトしています。
  • 標準エラー出力を標準出力と同じ場所にリダイレクト
    2>&1 と指定することで、標準エラー出力(2番)を標準出力(1番)と同じ場所にリダイレクトしています。
    &1& は、「ファイル名ではなくファイルディスクリプター番号で指定する」ことを示します。

コマンドの動作イメージ

結果の確認

 result.txt の内容を確認すると、コマンドの出力結果とエラーメッセージが両方とも保存されています。

user01@ubuntu:~$ cat result.txt
ls: 'non_exist.txt' にアクセスできません: そのようなファイルやディレクトリはありません
  • この例では、non_exist.txt というファイルが存在しないため、ls コマンドはエラーメッセージを標準エラー出力に出力しました。
  • 2>&1 によって、このエラーメッセージも result.txt にリダイレクトされました。

応用:コマンドの結果とエラーメッセージをログファイルに保存

 この方法を使うことで、長時間実行するコマンドやバッチ処理のログを一つのファイルにまとめて記録できます。

例:some_command の実行結果とエラーメッセージを logfile.txt に保存

$ some_command > logfile.txt 2>&1
  • これにより、some_command の標準出力と標準エラー出力の両方が logfile.txt に記録されます。

注意点:リダイレクトの順序

リダイレクトの記述順序は重要です。順序を間違えると、期待した結果にならない場合があります。

誤った例

user01@ubuntu:~$ ls non_exist.txt 2>&1 > result.txt
ls: 'non_exist.txt' にアクセスできません: そのようなファイルやディレクトリはありません

問題点

  • 2>&1 が先に評価され、標準エラー出力が現在の標準出力(端末ディスプレイ)にリダイレクトされます。
  • その後、標準出力が result.txt にリダイレクトされるため、エラーメッセージは画面に表示され、result.txt には標準出力のみが保存されます。

正しい順序

 標準出力のリダイレクト > を先に記述し、その後に標準エラー出力のリダイレクト 2>&1 を記述します。

user01@ubuntu:~$ ls non_exist.txt > result.txt 2>&1
user01@ubuntu:~$ cat result.txt 
ls: 'non_exist.txt' にアクセスできません: そのようなファイルやディレクトリはありません

これにより、標準出力と標準エラー出力の両方が result.txt に保存されます。

不要なファイルの削除

作成したリダイレクト先のファイルが不要になった場合は、rm コマンドで削除できます。

user01@ubuntu:~$ rm result.txt
user01@ubuntu:~$ ls
snap  ダウンロード  デスクトップ  ビデオ  ミュージック
work  テンプレート  ドキュメント  ピクチャ  公開

まとめ

  • 標準出力と標準エラー出力をまとめてリダイレクトするには、2>&1 を使用します。
  • ファイルディスクリプターを理解することで、入出力のリダイレクトを柔軟に制御できます。
  • リダイレクトの順序に注意が必要で、まず標準出力をリダイレクトし、その後に標準エラー出力をリダイレクトします。
  • この方法を活用することで、コマンドの結果とエラーメッセージを一つのファイルにまとめて記録でき、ログ管理やデバッグに役立ちます。