【问题标题】:If redirecting STDERR to STDOUT and redirecting STDOUT to a file, why are STDERR messages not showing in the file?如果将 STDERR 重定向到 STDOUT 并将 STDOUT 重定向到文件,为什么文件中没有显示 STDERR 消息?
【发布时间】:2012-06-16 07:43:35
【问题描述】:

我快速编写了一个小脚本 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。

【问题讨论】:

    标签: bash unix io-redirection


    【解决方案1】:

    我在使用 Bash 版本 GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 的 RedHat 上遇到了同样的问题。在我的 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]$ 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我看到 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)
        

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 1970-01-01
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-18
          • 2016-02-19
          • 1970-01-01
          相关资源
          最近更新 更多