如果将STDERR重定向到STDOUT并将STDOUT重定向到文件,为什么STDERR消息没有显示在文件中?

时间:2012-06-13 10:55:26

标签: bash unix io-redirection

我制作了一个快速的小脚本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) - 发布。

3 个答案:

答案 0 :(得分:3)

您的脚本将“StdErr”写入文件。然后,下一行用“StdOut”覆盖该文件。如果要附加到文件,则应使用>>。由于您要重定向,/dev/stderr/dev/stdout是常规文件,因此需要截断。再次尝试测试,但这次使file成为一个fifo而不是常规文件。

答案 1 :(得分: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)

答案 2 :(得分:1)

我在RedHat上遇到与Bash版本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]$