Grep
是否可以在 Bash 中編寫別名或函式來過濾掉錯誤(stderr)?
我有時會做
grep -ri foo .
但在某些 node_modules 中,它可能有一些指向不存在的地方的連結。所以我可以做一個
grep -ri foo . 2>&-
或者
grep -ri foo . 2> /dev/null
但有時很難記住。是否可以寫一個別名,以便
grep -ri foo . | discarderr
能行得通?我認為這可能很難做到,因為只有 stdout 被傳遞給
discarderr
. 可能沒有辦法將 stderr 和 stdout 都傳遞給discarderr
並discarderr
丟棄錯誤,例如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 grap
(grep
拼寫錯誤)不會輸出任何內容。