#navi(../)
*2>&1を指定した場合のバックグラウンド実行の&は何処に記述すればよいか [#d5082369]

2>&1により標準エラーを標準出力に変更し&によるバックグラウンド実行をしたい場合、以下のどちらの記述が正しいのかちょっと気になり確かめてみた。

- 2>&1の後にバックグラウンド実行の&を付加
 コマンド > out.log 2>&1 &
- 2>&1の前にバックグラウンド実行の&を付加
 コマンド > out.log & 2>&1

#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)
#contents

* 関連資料 [#i011e8c3]
-[[標準エラー出力をファイルに出力する方法>逆引きUNIXコマンド/標準エラー出力をファイルに出力する方法]]
-[[echoコマンドの出力を標準エラー(stderr)に出力する方法>逆引きUNIXコマンド/echoコマンドの出力を標準エラー(stderr)に出力する方法]]
-[[端末から起動したプロセスを切り離す方法>逆引きシェルスクリプト/端末から起動したプロセスを切り離す方法]]
-[[teeコマンドでstderr(標準エラー)も対象にする>逆引きUNIXコマンド/teeコマンドでstderr(標準エラー)も対象にする]]

* 確認シェルスクリプト [#m7856aeb]
以下のような、stdout, stderrにechoするシェルスクリプトを作成した。
#ref(bg.sh)
 #/bin/bash
 for i in `seq 1 5`
 do
  echo "stdout"
  echo "stderr" 1>&2
 done
(1>&2の意味はstderrにechoするようにする。参考資料:「[[逆引きUNIXコマンド/echoコマンドの出力を標準エラー(stderr)に出力する方法]]」)

* 実行結果 [#n9185f21]
バックグラウンド実行の&の位置を2>&1の前と後ろで動作させてみた結果は以下の通り。

** バックグラウンド実行の&が2>&1の後ろの場合 [#s77c5f29]
作成した確認シェルスクリプトを下行のようにして起動
 ./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ファイルに出力されているので意図した動作となっている。

** バックグラウンド実行の&が2>&1の前の場合 [#mc3e48ce]
作成した確認シェルスクリプトを下行のようにして起動
 ./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は端末に出力され意図した動作となっていない。
#br
#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)
#br

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS