在 csh 中重定向 stderr

Redirecting stderr in csh

我正在执行一个将崩溃报告转储到 STDERR 的程序,我必须从那里过滤一些必要的信息。问题是我无法使用 grep

STDERR 重定向到 STDOUTPIPE
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl

获取错误:Ambiguous output redirect.

相同的命令在 bash 终端下有效。 我应该更改什么才能使其正常工作?

如果您不介意将 stdout 和 stderr 混合到管道中,您可以使用

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

否则你可以破解:

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

将 stdout 分隔为 null,然后管道 stdout 和 stderr 只是给出 stderr 作为内容。

在文件重定向方面,

csh 比 bash 明显更受限制。在 csh 中,您可以使用通常的 > 运算符重定向 stdout,您可以使用 >& 运算符重定向 stdoutstderr,你可以使用 |& 运算符对 stdoutstderr 进行管道传输,但是没有单个运算符可以单独重定向 stderr

通常的解决方法是在子 shell 中执行命令,将子 shell 中的 stdout 重定向到您想要的任何文件(/dev/null这种情况),然后使用 |& 运算符将子 shell 的 stdoutstderr 重定向到主 shell 中的下一个命令。 =33=]

在您的情况下,这意味着:

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

因为 stdout 被重定向到子 shell 内的 /dev/null|& 运算符最终将充当 [=41] 中的 2>&1 =] - 因为 stdout 在子 shell 中被丢弃,所以写入 stdout 的任何内容都不会到达管道。