標準エラー出力への出力
echo コマンドの出力結果を、デフォルトの標準出力ではなく、標準エラー出力に出力するには、末尾で 1>&2 のようにリダイレクトします(>&2 という省略形でも OK)。
#!/bin/bash
echo "Hello World" 1>&2
このように出力先を制御したプログラムは、実行結果をリダイレクトしたり、パイプ接続した場合の振る舞いに影響してきます。
#!/bin/bash
echo AAA
echo BBB 1>&2
echo CCC上記のプログラムの出力結果を out.txt というファイルにリダイレクトすると、ターミナル上には BBB という標準エラー出力のみが表示されます。
$ ./sample.sh > out.txt
BBB
AAA
CCCcat の場合
cat コマンドによるヒアドキュメントでも、標準エラー出力に出力できます。
cat 1>&2 <<EOF
AAA AAA AAA
BBB BBB BBB
CCC CCC CCC
EOF
シェルスクリプトの Usage 出力などに便利です。
usage() {
cat 1>&2 <<EOF
Usage: $(basename $0) [OPTIONS]
Options:
-h Display this message
-d DIR Output directory (default: .)
-v Use verbose output
EOF
exit -1
}
その他の出力先制御
コマンドの出力をさまざまな形でリダイレクトすることで、本来の標準出力、標準エラー出力への出力を次のように振り分けることができます。
| コマンド形式 | 標準出力 | 標準エラー出力 |
|---|---|---|
command | STDOUT | STDERR |
command 1>&2command >&2 | STDERR | STDERR |
command 2>&1 | STDOUT | STDOUT |
command > /dev/null | ─ | STDERR |
command > /dev/null 2>&1 | ─ | ─ |
command > file | FILE | STDERR |
command > file 2>&1 | FILE | FILE |
command 2>&1 > file | FILE | STDOUT |
STDOUT: 標準出力 / STDERR: 標準エラー出力 / FILE: ファイル / ─: 出力されない例えば echo Hello とすると、通常は Hello が標準出力に出力されますが、echo Hello 1>&2 とすると、標準出力が標準エラー出力に切り替わって Hello が標準エラー出力に出力されるようになります。
読み解き方:
&1… 現在、標準出力 (1) に割り当てられている出力先&2… 現在、標準エラー出力 (2) に割り当てられている出力先1>&2… 標準出力 (1) の出力先を&2に切り替える2>&1… 標準エラー出力 (2) の出力先を&1に切り替える> file… 標準出力 (1) の出力先を file に切り替える