2015-08-14 82 views
4

我正在執行一個程序,將崩潰報告轉儲到STDERR中,我必須從中篩選出一些必要的信息。問題是,我無法STDERR重定向到STDOUTPIPEgrep在csh中重定向stderr

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

四處錯誤:Ambiguous output redirect.

下的bash終端相同的命令作品。 我應該改變什麼才能使它工作?

回答

7

csh是顯著比bash的更有限的,當它涉及到文件重定向。在csh,您可以重定向stdout與通常>操作,您可以使用>&運營商都stdoutstderr重定向,可以通過管道stdoutstderr|&運營商,但沒有一個單一的運營商單獨重定向stderr

通常的解決辦法是在一個子shell來執行命令,在子shell你想要的任何文件(/dev/null在這種情況下)重定向stdout,然後用|&操作重定向的stdoutstderr子shell到主shell中的下一個命令。

在你的情況,這意味着類似:

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

因爲stdout被重定向到/dev/null子shell裏面,|&運營商最終會在bash作爲2>&1 - 因爲stdout在被丟棄子外殼,沒有任何寫到stdout將永遠到達管道。

+1

我認爲通常的解決方法是調用'sh':'sh -c「命令2>&1>/dev/null」' –

+0

@WilliamPursell是的,當然。我認爲他出於某種原因想留在csh。 –

5

如果你不介意混合輸出和錯誤進入管道可以使用

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

否則,你可以做黑客:

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

其標準輸出分離出來爲null,則管道stdout和stderr只會將 stderr作爲內容。