在csh中重定向stderr

18

我正在执行一个程序,该程序将崩溃报告转储到 STDERR 中,我需要从中筛选出一些必要的信息。问题是我无法将 STDERR 重定向到 STDOUT 并使用 grep 进行 PIPE

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

出现错误:Ambiguous output redirect.

在 Bash 终端下,相同的命令可以正常工作。我应该做什么才能让它起作用?


请参阅此答案 - Petr Vepřek
2个回答

29

csh相对于 bash 在文件重定向方面的功能受到了很大的限制。在csh中,您可以使用通常的>操作符来重定向标准输出(stdout),使用>&操作符来重定向标准输出和错误输出(stderr),使用|&操作符来管道化标准输出和错误输出(stdoutstderr),但是没有单独重定向错误输出的操作符。

通常的解决方法是在子Shell中执行命令,将子Shell中的标准输出(stdout)重定向到所需文件(在本例中为/dev/null),然后使用|&操作符将子Shell的标准输出和错误输出(stdoutstderr)重定向到主Shell中的下一个命令。

对于您的情况,这意味着类似于:

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

由于在子shell内重定向了stdout/dev/null,所以|&运算符在bash中最终会作为2>&1来处理 - 由于子shell中的stdout被丢弃,因此任何写入stdout的内容都不会传递到管道中。


3
我认为通常的解决方法是调用 shsh -c "command 2>&1 > /dev/null"。请注意,我的翻译仅涉及原文的转换,不会包括任何解释或其他内容。 - William Pursell
2
@WilliamPursell 好的,没问题。我假设他有某些原因想要继续使用csh。 - Filipe Gonçalves

7

如果您不介意将标准输出和标准错误混合到管道中,您可以使用以下命令:

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

否则,您可以使用以下方法进行“hack”:
(command >/dev/null) |& grep "^[^-]" >& /tmp/fl

这将stdout输出到null,然后通过管道将stdout和stderr连接起来,只返回stderr内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接