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