背景
標準出力と標準出力エラーを /dev/null にリダイレクトして破棄する時、正しく記述できているか不安になることが個人的によくあります。
which_is_correct?
$ script 2>&1 /dev/null
$ script > /dev/null 2>&1
手軽に動作確認をする手段として、以下のようなスクリプトを用意します。
stdcheck
#!/bin/bash
echo "This is stdout"
echo "This is stderr" 1>&2
確認例
1. 標準出力、標準エラー出力の両方を出力
$ stdcheck
This is stdout
This is stderr
# リダイレクトしなければ、両方出力される
2. 標準出力のみを捨てる
$ stdcheck > /dev/null
This is stderr
$ stdcheck 1> /dev/null
This is stderr
3. 標準エラー出力のみを捨てる
$ stdcheck 2> /dev/null
This is stdout
4. 標準出力、標準エラー出力の両方を捨ててみる(1)
$ stdcheck 2>&1 > /dev/null
This is stderr
#-> 標準エラー出力が捨てられていない(期待する動きではない)
5. 標準出力、標準エラー出力の両方を捨ててみる(2)
$ stdcheck > /dev/null 2>&1
#-> 標準出力、標準エラー出力の両方が捨てられている!
6. 標準出力、標準エラー出力の両方を捨ててみる(3)
$ stdcheck 2>&1 | cat > /dev/null
#-> パイプを通すと、この順番でも捨てられている!