1

我制作了一个快速的小脚本 test.sh,如下所示:

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

根据这个SO questionAdvanced 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)-release。

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)。在我的带有 Bash 和 ZSH 的 Mac 上,两者都按预期工作。

[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 回答