【问题标题】:Msys: how to keep STDERR on the screen and at the same time copy both STDOUT and STDERR to filesMsys:如何在屏幕上保留 STDERR 并同时将 STDOUT 和 STDERR 复制到文件中
【发布时间】:2016-06-17 07:55:01
【问题描述】:

我希望能够

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

有关信息,我正在使用 Msys 来执行此操作。

.

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

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

我收到以下错误:

sh: 意外标记 `>' 附近的语法错误

.

你知道怎么做吗?

【问题讨论】:

    标签: sh msys


    【解决方案1】:

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

    解决方法是 grep 我们希望将它们保留在屏幕上的所有错误和警告。

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

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

    【讨论】:

    • 这是一个很好的解决方法。你能不使用grep -E 来获取STDERR,而是使用grep -v 来排除STDOUT 并获取其他所有内容吗?好吧,这假设您知道 STDOUT 是什么,但事实可能并非如此。
    • @ViniciusPlacco:如果您知道 STDOUT 中的内容,您绝对可以使用grep -v ... 重点是,错误和警告的模式要容易得多:)
    • 很公平 :) 两个都放在口袋里很好。谢谢!
    【解决方案2】:

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

    #!/bin/bash
    echo hello
    rm something 
    exit
    

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,尽管它可能不适用于 MSys,但仅适用于 Cygwin 或 shell。你在哪里运行这个 shell 命令?
    • 我在bash 的 MAC OS 终端上运行了这个。我不确定在 MSYS 上运行。
    • ...不幸的是,正如我所提到的,它不能在 Msys 中工作。不过可能在 Cygwin 中工作。
    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多