2>&1により標準エラーを標準出力に変更し&によるバックグラウンド実行をしたい場合、以下のどちらの記述が正しいのかちょっと気になり確かめてみた。
コマンド > out.log 2>&1 &
コマンド > out.log & 2>&1
以下のような、stdout, stderrにechoするシェルスクリプトを作成した。
#/bin/bash for i in `seq 1 5` do echo "stdout" echo "stderr" 1>&2 done
(1>&2の意味はstderrにechoするようにする。参考資料:「逆引きUNIXコマンド/echoコマンドの出力を標準エラー(stderr)に出力する方法」)
バックグラウンド実行の&の位置を2>&1の前と後ろで動作させてみた結果は以下の通り。
作成した確認シェルスクリプトを下行のようにして起動
./bg.sh > out.log 2>&1 &
実行結果
$ ./bg.sh > out.log 2>&1 & [1] 6029 $ [1]+ Done ./bg.sh > out.log 2>&1 $ cat out.log stdout stderr stdout stderr stdout stderr stdout stderr stdout stderr
stdout, stdout共にout.logファイルに出力されているので意図した動作となっている。
作成した確認シェルスクリプトを下行のようにして起動
./bg.sh > out.log & 2>&1
実行結果
$ ./bg.sh > out.log & 2>&1 [1] 6035 $ stderr stderr stderr stderr stderr
[1]+ Done ./bg.sh > out.log $ cat out.log stdout stdout stdout stdout stdout
stdoutのみout.logファイルに出力されstderrは端末に出力され意図した動作となっていない。