Grep

是否可以在 Bash 中編寫別名或函式來過濾掉錯誤(stderr)?

  • February 23, 2020

我有時會做

grep -ri foo .

但在某些 node_modules 中,它可能有一些指向不存在的地方的連結。所以我可以做一個

grep -ri foo . 2>&-

或者

grep -ri foo . 2> /dev/null

但有時很難記住。是否可以寫一個別名,以便

grep -ri foo . | discarderr 

能行得通?我認為這可能很難做到,因為只有 stdout 被傳遞給discarderr. 可能沒有辦法將 stderr 和 stdout 都傳遞給discarderrdiscarderr丟棄錯誤,例如

alias discarderr='cat 2> /dev/null'

有沒有辦法做到這一點,或者可能是通過一個函式,但如果它是類似的東西,它可能看起來有點尷尬discarderr(grep -ri foo .)

似乎 grep-s可以使錯誤消息靜音。但是其他命令的通用解決方案呢?

執行作為一個或多個參數給出的命令並丟棄其標準錯誤流的 shell 函式:

discarderr () {
   "$@" 2>/dev/null
}

執行相同操作的別名:

alias discarderr='2>/dev/null'

兩者的使用方式相同:

discarderr some-command

2>/dev/null…儘管從長遠來看,這可以說是混淆了命令並且比僅僅添加到命令更麻煩。例如,您必須記住在您使用的每個系統上實例化別名或函式,如果您在腳本中使用該函式,它會隱藏您正在丟棄來自瀏覽程式碼的人的診斷消息的事實。

此外,診斷消息很有用,理想情況下,您應該糾正死符號連結等問題,而不是解決它們導致試圖通過它們訪問數據的程序出錯的事實。

另請注意,使用discarderr會使調試“奇怪”問題變得更加困難。例如,您無法查看是否執行了命令*,*因為例如discarderr grapgrep拼寫錯誤)不會輸出任何內容。

引用自:https://unix.stackexchange.com/questions/569214