在 csh 中重定向 stderr

Posted

技术标签:

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

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

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

收到错误:Ambiguous output redirect.

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

【问题讨论】:

【参考方案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 作为内容。

【讨论】:

以上是关于在 csh 中重定向 stderr的主要内容,如果未能解决你的问题,请参考以下文章

Linux中重定向管道和grep命令总结

Linux中重定向管道和grep命令总结

在C中重定向子进程的文件输出

如何在NGINX中重定向一个网址

在win32中重定向标准输出不会重定向标准输出

在 Laravel 中重定向域名