在 csh 中重定向 stderr
Posted
技术标签:
【中文标题】在 csh 中重定向 stderr【英文标题】:Redirecting stderr in csh 【发布时间】:2015-11-07 18:11:51 【问题描述】:我正在执行一个程序,它将崩溃报告转储到STDERR
,我必须从中过滤一些必要的信息。问题是我无法使用grep
将STDERR
重定向到STDOUT
和PIPE
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
收到错误:Ambiguous output redirect.
相同的命令在 bash 终端下工作。 我应该改变什么才能让它工作?
【问题讨论】:
【参考方案1】:csh
在文件重定向方面明显比 bash 受限。在csh
中,您可以使用通常的>
运算符重定向stdout
,您可以使用>&
运算符重定向stdout
和stderr
,您可以使用@ 管道stdout
和stderr
987654330@ 运算符,但没有单个运算符可以单独重定向stderr
。
通常的解决方法是在子shell中执行命令,将该子shell中的stdout
重定向到您想要的任何文件(在这种情况下为/dev/null
),然后使用|&
操作符重定向子shell的stdout
和stderr
到主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的主要内容,如果未能解决你的问题,请参考以下文章