【问题标题】:echo to stderr and tee to log file?回显到 stderr 和 tee 到日志文件?
【发布时间】:2012-11-01 19:05:15
【问题描述】:

在 bash 脚本中,

回显“错误”1>&2 | tee -a 日志

会在屏幕上打印 stderr 但没有日志到文件,如何同时执行这些操作?

【问题讨论】:

    标签: bash


    【解决方案1】:

    但默认只有标准输出在管道中传递,所以在

    $ echo "error" | tee 
    

    tee 只能看到来自echo 的粗壮,而不是标准错误。 stderr 仍会显示在终端中。

    【讨论】:

      【解决方案2】:
      echo "error" 1>&2 | tee -a log
      

      对于第一部分1>&2,您的意思是:“将标准输出重定向到标准错误”。所以 echoed 输出 "error" 进入 stderr。

      管道 (|) 仅从 stdout 读取,而不是从 stderr 读取。所以tee 根本没有从管道中得到任何stdin。因此,它不会向日志文件附加任何内容。

      【讨论】:

      • +1。非常好的答案,除了一个解决方案:可能值得提及 2>&1 是正确的。
      • 是的,ic。但是如何回显到标准错误并将错误日志写入文件?
      • @timy 如果您将标准错误重定向到标准输出,那么您可以这样做:echo "error" 2>&1 | tee -a log。现在两个 stderr 也将转到 stdout,您可以在屏幕上看到它们,并且还会附加到日志中。
      • @KingsIndian 2>&1 不会向 stderr 输出任何内容,这是我想在这里做的。
      • @timy 除非发生一些严重错误,否则“回显”输出只会转到stdout。你是对的,2>&1 不会向标准错误写入任何内容。但是由于 stdout 和 stderr 都去控制台,你真的不需要担心。
      【解决方案3】:

      要在控制台上查看 stdout 和 stderr 并将两个流都发送到日志,请将 stderr 重定向到 stdout,如下所示:

      progam.sh 2>&1 | tee -a log
      

      【讨论】:

        【解决方案4】:

        要将文本回显到日志文件和标准错误,而不是标准输出,试试这个:

        echo "error" | tee -a log 1>&2
        

        【讨论】:

        • 我不是 100% 确定 OP 想要做什么,但这是迄今为止我自己情况的最佳解决方案。我认为问题在于很容易认为应该将重定向应用于echo,但是对tee 命令执行此操作非常有效,谢谢!
        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 2019-03-29
        • 2011-05-30
        • 2017-05-31
        相关资源
        最近更新 更多