1

次のような簡単なスクリプト test.sh を作成しました。

echo "StdErr" > /dev/stderr
echo "StdOut" > /dev/stdout

このSO questionへの回答とAdvanced Bash-Scripting Guideによると、以下は上記のスクリプトから stderr を stdout にリダイレクトする必要があります。

$ sh /tmp/test.sh 2>&1 

そして確かにそうです:

$ sh /tmp/test.sh 2>&1 |tee file;
$ cat file
StdErr
StdOut

私が疑問に思っているのは、次のコードで stderr からの出力がどこに行くのかということです。

$ sh /tmp/test.sh > file 2>&1
$ cat file
StdOut

GNU bash、バージョン 4.0.24(2) リリースを使用しています。

4

3 に答える 3

3

スクリプトは「StdErr」をファイルに書き込みます。次に、次の行でファイルを「StdOut」で上書きします。>>ファイルに追加する場合に使用する必要があります。リダイレクトしているため、/dev/stderr通常/dev/stdoutのファイルであるため、切り捨ての対象となります。テストを再試行しますが、今回fileは通常のファイルの代わりに fifo を作成します。

于 2012-06-13T16:53:34.847 に答える
2

期待どおり、stderr への出力がファイルに出力されていることがわかります。

$> sh test.sh > file 2>&1
$> cat file 
StdErr
StdOut

これは bash 3.2.48 です。

$> bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
于 2012-06-13T10:57:59.900 に答える
1

Bash バージョンの RedHat でも同じ問題がありGNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)ます。私の Mac では、Bash と ZSH の両方が期待どおりに動作します。

[13:31:05][user@machine: ~/src]$ bash test
1STD ERR
2STD ERR
3STD OUT
4STD OUT
[13:31:40][user@machine: ~/src]$ bash test >> log 2>&1
[13:31:48][user@machine: ~/src]$ cat log 
4STD OUT
[13:31:52][user@machine: ~/src]$ 
[13:32:10][user@machine: ~/src]$ bash test > log 2>&1
[13:32:15][user@machine: ~/src]$ cat log 
4STD OUT
[13:32:18][user@machine: ~/src]$ 
于 2012-10-29T13:37:15.817 に答える