導入
画面に出ている文字は、実は2本の別々の流れです。ふつうの結果と、エラーメッセージ。この2本を分けて扱えると、「結果はファイルへ、エラーだけ画面に」といった仕分けができるようになります。自動化には必須の知識です。
説明
コマンドの出力は2本あります。
- 標準出力(stdout, 1番): ふつうの結果
- 標準エラー出力(stderr, 2番): エラーメッセージ
flowchart LR
C["コマンド"] -->|"標準出力 (1)"| S["画面"]
C -->|"標準エラー出力 (2)"| S
C -.->|"> file"| F["ファイルへ"]
C -.->|"2> error.log"| E["エラーだけ別ファイルへ"]
C -.->|"> /dev/null"| N["/dev/null(捨てる)"]
行き先を変える記号が リダイレクト です。
| 書き方 | 意味 |
|---|---|
> file | 標準出力をファイルへ(上書き) |
>> file | 標準出力をファイルへ(追記) |
2> file | 標準エラー出力だけをファイルへ |
2>&1 | 標準エラー出力を標準出力と同じ行き先へ合流させる |
> /dev/null | 捨てる(/dev/null は捨て場) |
#!/bin/bash
echo "これは普通の結果です"
# 存在しないファイルを読む → エラーは 2 番の流れに出る
cat noexist.txt 2> error.log
echo "エラーの内容:"
cat error.log
# 結果もエラーもまとめて1つのログへ
echo "まとめて記録します" > all.log 2>&1
cat all.log
実務でいちばん見かけるのが >> ログファイル 2>&1 です。「結果もエラーも、まとめてログに追記する」という意味で、cron(第8章)に登録するスクリプトでは定番になります。
順番に意味があります。
> file 2>&1は「まず標準出力をファイルへ、次にエラーもそこへ」。逆に書くと期待どおりになりません。まずは>> ログ 2>&1という並びを型として覚えてしまうのが早道です。
やってみよう
スクリプトを実行して、cat noexist.txt のエラーが画面ではなく error.log に入ることを確かめましょう。次に 2> error.log の部分を消して実行し、エラーが画面に出ることと比べてください。cat noexist.txt 2> /dev/null にすると、エラーは消えてなくなります。
演習
cat noexist.txt のエラーを画面にも出さず捨てて、そのあと 処理を続けます と表示してください。
ヒント1を見る
捨て場は /dev/null。エラーの行き先を変えるのは 2> です。
ヒント2を見る
cat noexist.txt 2> /dev/null の次の行に echo "処理を続けます"