本文へスキップ
BecomeCoder

シェルスクリプトコース · 第3章 引数と入出力 · レッスン11

標準出力と標準エラー出力 ― 出す先を仕分ける

ブラウザで完結

導入

画面に出ている文字は、実は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 "処理を続けます"

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。