標準エラーのリダイレクトとストリームの結合
このステップでは、標準エラー(stderr)をリダイレクトする方法と、stdout と stderr を単一のストリームに結合する方法を学びます。これは、コマンドによって生成されたエラーメッセージを管理するために不可欠であり、必要に応じてログに記録したり、破棄したりできます。
stderr はファイル記述子 2 であることを思い出してください。エラーメッセージをリダイレクトするには 2> を使用します。
標準エラーをファイルにリダイレクトする
場合によっては、標準出力とは別にキャプチャしたいエラーメッセージがコマンドから生成されることがあります。
-
~/project ディレクトリにいることを確認します。
cd ~/project
[labex@host project]$
-
存在しないディレクトリの内容をリスト表示してみましょう。これにより、エラーメッセージが生成されます。
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
エラーメッセージが端末に直接出力されているのがわかります。
-
次に、このエラーメッセージを errors.log というファイルにリダイレクトします。
ls non_existent_directory 2> errors.log
今回は、エラーメッセージが端末に表示されません。
-
errors.log の内容を確認します。
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
エラーメッセージがファイルに保存されました。
標準エラーを破棄する
多くの場合、不要なノイズの多いエラーメッセージを生成するコマンドを実行したい場合があります。そのような場合は、stderr を /dev/null にリダイレクトできます。/dev/null は、そこに書き込まれたすべてのデータを破棄する特別なデバイスファイルです。
-
存在しないディレクトリで ls コマンドをもう一度試しますが、今回はエラーを破棄します。
ls non_existent_directory 2> /dev/null
端末には何も出力されず、エラーメッセージもファイルに保存されません。
標準出力と標準エラーを結合する
stdout と stderr の両方を同じファイルにキャプチャしたい場合があります。これはいくつかの方法で行うことができます。
方法 1: > file 2>&1
この方法は、stdout をファイルにリダイレクトし、次に stderr を stdout と同じ場所にリダイレクトします。順序 2>&1 が重要です。これは、「ファイル記述子 2 (stderr) をファイル記述子 1 (stdout) と同じ場所にリダイレクトする」ことを意味します。
-
標準出力と標準エラーの両方を生成するコマンドを作成しましょう。find を使用して、アクセス許可のあるディレクトリとアクセス許可のないディレクトリでファイルを検索します。
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
ここで、find ~/project -name "current_datetime.txt" は stdout を生成し(見つかった場合)、find /root -name "current_datetime.txt" は、アクセス許可の問題により、おそらく stderr を生成します。
-
combined_output.log ファイルを調べます。
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
成功した出力(ファイルのパス)とエラーメッセージの両方が同じファイルにキャプチャされていることがわかります。
方法 2: &> file (Bash 固有)
Bash は、stdout と stderr をファイルに結合するための短縮形 &> を提供しています。これは > file 2>&1 と同等です。
-
&> 短縮形を使用して、同じ find コマンドを試してみましょう。
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
combined_output_shorthand.log の内容を確認します。
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
結果は前の方法と同じであり、&> の便利さを示しています。
結合されたストリームを追加する
stdout と同様に、>> file 2>&1 または &>> file を使用して、結合された stdout と stderr をファイルに追加できます。
-
さらに出力とエラーを combined_output.log に追加します。
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
更新された combined_output.log を表示します。
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
新しい出力とエラーが既存の内容に追加されます。
これで、標準エラーをリダイレクトする方法と、標準出力と標準エラーを単一のファイルに結合する方法を正常に学習しました。この知識は、堅牢なスクリプト作成とシステム管理タスクに不可欠です。