我正在执行一个程序,将崩溃报告转储到STDERR
,我必须从中过滤一些必要的信息。问题是我无法将STDERR
重定向到STDOUT
,PIPE
将grep
重定向到<{1}}
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
获取错误:Ambiguous output redirect.
相同的命令在bash终端下工作。 我应该改变什么才能使它发挥作用?
答案 0 :(得分:11)
csh
比bash更受限制。在csh
中,您可以使用通常的stdout
运算符重定向>
,您可以使用stdout
运算符重定向stderr
和>&
,可以使用stdout
运算符管道stderr
和|&
,但没有一个运算符可以单独重定向stderr
。
通常的解决方法是在子shell中执行命令,将该子shell中的stdout
重定向到您想要的任何文件(在本例中为/dev/null
),然后使用{{ 1}}运算符将子shell的|&
和stdout
重定向到主shell中的下一个命令。
在您的情况下,这意味着:
stderr
由于( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl
被重定向到子shell内的stdout
,因此/dev/null
运算符最终会在bash中充当|&
- 因为2>&1
是在子shell中丢弃,写入stdout
的任何内容都不会到达管道。
答案 1 :(得分:5)
如果你不介意将stdout和stderr混合到管道中,你可以使用
command |& grep "^[^-]" >& /tmp/fl
否则你可以做黑客攻击:
(command >/dev/null) |& grep "^[^-]" >& /tmp/fl
将stdout分隔为null,然后管道stdout和stderr给出 stderr作为内容。