在csh

时间:2015-08-14 13:08:01

标签: linux shell csh tcsh

我正在执行一个程序,将崩溃报告转储到STDERR,我必须从中过滤一些必要的信息。问题是我无法将STDERR重定向到STDOUTPIPEgrep重定向到<{1}}

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

获取错误:Ambiguous output redirect.

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

2 个答案:

答案 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作为内容。