【问题标题】:Redirecting stderr in csh在 csh 中重定向 stderr
【发布时间】:2015-11-07 18:11:51
【问题描述】:

我正在执行一个程序,它将崩溃报告转储到STDERR,我必须从中过滤一些必要的信息。问题是我无法使用grepSTDERR 重定向到STDOUTPIPE

command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl

收到错误:Ambiguous output redirect.

相同的命令在 bash 终端下工作。 我应该改变什么才能让它工作?

【问题讨论】:

    标签: linux shell csh tcsh


    【解决方案1】:

    csh 在文件重定向方面明显比 bash 受限。在csh 中,您可以使用通常的> 运算符重定向stdout,您可以使用>& 运算符重定向stdoutstderr,您可以使用@ 管道stdoutstderr 987654330@ 运算符,但没有单个运算符可以单独重定向stderr

    通常的解决方法是在子shell中执行命令,将该子shell中的stdout重定向到您想要的任何文件(在这种情况下为/dev/null),然后使用|&操作符重定向子shell的stdoutstderr到主shell中的下一条命令。

    在您的情况下,这意味着:

    ( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl
    

    因为stdout 被重定向到子shell 内的/dev/null|& 运算符最终将在bash 中充当2>&1 - 因为stdout 在子shell 中被丢弃,所以没有写入任何内容stdout 将永远到达管道。

    【讨论】:

    • 我认为通常的解决方法是调用 sh: sh -c "command 2>&1 > /dev/null"
    • @WilliamPursell 是的,当然。我以为他出于某种原因想留在 csh。
    【解决方案2】:

    如果您不介意将 stdout 和 stderr 混合到管道中,您可以使用

    command |& grep "^[^-]" >& /tmp/fl
    

    否则你可以做黑客:

    (command >/dev/null) |& grep "^[^-]" >& /tmp/fl
    

    将标准输出分离为空,然后管道标准输出和标准错误只是给出 stderr 作为内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 2014-10-23
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2014-07-22
      • 2017-01-26
      相关资源
      最近更新 更多