我正在执行一个程序,该程序将崩溃报告转储到 STDERR
中,我需要从中筛选出一些必要的信息。问题是我无法将 STDERR
重定向到 STDOUT
并使用 grep
进行 PIPE
。
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
出现错误:Ambiguous output redirect.
在 Bash 终端下,相同的命令可以正常工作。我应该做什么才能让它起作用?
csh
相对于 bash
在文件重定向方面的功能受到了很大的限制。在csh中,您可以使用通常的>
操作符来重定向标准输出(stdout
),使用>&
操作符来重定向标准输出和错误输出(stderr
),使用|&
操作符来管道化标准输出和错误输出(stdout
和stderr
),但是没有单独重定向错误输出的操作符。
通常的解决方法是在子Shell中执行命令,将子Shell中的标准输出(stdout
)重定向到所需文件(在本例中为/dev/null
),然后使用|&
操作符将子Shell的标准输出和错误输出(stdout
和stderr
)重定向到主Shell中的下一个命令。
对于您的情况,这意味着类似于:
( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl
由于在子shell内重定向了stdout
到/dev/null
,所以|&
运算符在bash中最终会作为2>&1
来处理 - 由于子shell中的stdout
被丢弃,因此任何写入stdout
的内容都不会传递到管道中。
sh
:sh -c "command 2>&1 > /dev/null"
。请注意,我的翻译仅涉及原文的转换,不会包括任何解释或其他内容。 - William Pursell如果您不介意将标准输出和标准错误混合到管道中,您可以使用以下命令:
command |& grep "^[^-]" >& /tmp/fl
(command >/dev/null) |& grep "^[^-]" >& /tmp/fl
这将stdout输出到null,然后通过管道将stdout和stderr连接起来,只返回stderr内容。