標準出力と標準エラー出力の両方を 1 つのファイルにリダイレクトする
このステップでは、コマンドからのすべての出力(標準出力と標準エラー出力の両方)を 1 つのファイルにキャプチャする方法を学びます。これは、発生したエラーを含め、スクリプトやコマンドの実行記録を完全に残したい場合に特に便利です。
stdout と stderr の両方を生成するコマンドを使用してみましょう。存在するファイル (/etc/passwd) と存在しないファイル (non_existent_file) を同時にリスト表示します。
ls -l /etc/passwd non_existent_file
ターミナルに 2 種類の出力が表示されます。最初の行は標準エラー出力で、2 行目は標準出力です。
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
stdout 用の > だけを使ってリダイレクトしようとすると、エラーメッセージは画面に残ります。
ls -l /etc/passwd non_existent_file > output_only.txt
ターミナルの出力:
ls: cannot access 'non_existent_file': No such file or directory
そして、output_only.txt には標準出力のみが含まれます。
cat output_only.txt
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
両方のストリームを 1 つのファイルにリダイレクトするには、&> 演算子を使用できます。これは、stdout (ファイル記述子 1) と stderr (ファイル記述子 2) の両方を指定したファイルに送る便利な短縮形です。
試してみましょう。すべての出力を combined.log というファイルにリダイレクトします。
ls -l /etc/passwd non_existent_file &> combined.log
今回はターミナルに何も表示されません。すべての出力が combined.log にキャプチャされました。内容を確認してみましょう。
cat combined.log
ファイルに標準出力と標準エラー出力の両方が含まれていることがわかります。
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
同じ結果を得るための、より伝統的ですが少し複雑な構文もあります:> file 2>&1。これを分解すると以下のようになります。
> file: 標準出力 (ファイル記述子 1) を file にリダイレクトします。
2>&1: 標準エラー出力 (ファイル記述子 2) を標準出力 (ファイル記述子 1) と同じ場所にリダイレクトします。stdout は既に file に送られているため、stderr もそこに送られます。
この方法で、出力を combined_traditional.log に保存してみましょう。
ls -l /etc/passwd non_existent_file > combined_traditional.log 2>&1
やはりターミナルには何も表示されません。ファイルの内容を確認すると、同じ結果が得られます。
cat combined_traditional.log
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
&> の方が短く好まれることが多いですが、古いスクリプトでは 2>&1 を頻繁に見かけるため、その仕組みを理解しておくことは重要です。両方のストリームを追記したい場合は、&>> または >> file 2>&1 を使用します。