代码之家  ›  专栏  ›  技术社区  ›  Jean-Francois T.

Msys:如何将STDERR保持在屏幕上,同时将STDOUT和STDERR复制到文件

  •  1
  • Jean-Francois T.  · 技术社区  · 9 年前

    我希望能够

    • 在屏幕上显示STDERR
    • 在文件中复制STDOUT和STDERR(如果可能,在同一文件中)

    有关信息,我正在使用 Msys公司 这样做。

    .

    在对SO做了一些研究之后,我尝试使用类似的东西

    <my command> > >(tee stdout.log) 2> >(tee stderr.log)

    但是我得到了以下错误:

    sh:意外标记“>”附近出现语法错误

    .

    你知道怎么做吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Jean-Francois T.    9 年前

    Msys中可能没有直接的解决方案,但 >(tee ... ) 该解决方案在*Nix、OSX和可能的Cygwin中运行良好。

    解决方法是将所有要保留在屏幕上的错误和警告删除。

    我已成功使用以下命令生成文件来编译C代码:

    make 2>&1 | tee make.log | grep -E "(([Ee]rror|warning|make):|In function|undefined)"

        2
  •  1
  •   Community CDub    8 年前

    我有一个简单的脚本( test.sh )生成STDOUT和STDERR:

    #!/bin/bash
    echo hello
    rm something 
    exit
    

    然后,使用以下命令执行您想要执行的操作:

    ./test.sh > stdout.log 2> >(tee stderr.log >&2)
    

    您将在屏幕上看到STDERR,以及两个单独的日志文件,其中包含STDERR和STDOUT。我使用了给出的部分答案 here

    请注意,我假设您没有名为 something 在当前目录上:)

    如果希望STDOUT和STDERR都转到同一文件,请使用 -a 选项打开 tee :

    ./test.sh > std.log 2> >(tee -a std.log >&2)