このエントリーをはてなブックマークに追加


2>&1を指定した場合のバックグラウンド実行の&は何処に記述すればよいか

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

  • 2>&1の後にバックグラウンド実行の&を付加
    コマンド > out.log 2>&1 &
  • 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の前と後ろで動作させてみた結果は以下の通り。

バックグラウンド実行の&が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ファイルに出力されているので意図した動作となっている。

バックグラウンド実行の&が2>&1の前の場合

作成した確認シェルスクリプトを下行のようにして起動

./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は端末に出力され意図した動作となっていない。

 

 

添付ファイル: filebg.sh 550件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-27 (土) 18:40:45