我有时会这样做
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
可以消除错误消息的功能。但是其他命令的通用解决方案呢?
答案1
一种 shell 函数,执行作为一个或多个参数给出的命令并丢弃其标准错误流:
discarderr () {
"$@" 2>/dev/null
}
具有相同功能的别名:
alias discarderr='2>/dev/null'
两者的使用方式相同:
discarderr some-command
2>/dev/null
...尽管从长远来看,这可能会混淆命令,并且比仅仅添加到命令更麻烦。例如,您必须记住在您使用的每个系统上实例化别名或函数,如果您在脚本中使用该函数,它会隐藏您正在丢弃来自浏览代码的人的诊断消息的事实。
此外,诊断消息是有用,并且理想情况下您应该纠正诸如死符号链接等问题,而不是解决它们在尝试通过它们访问数据的程序中导致错误的事实。
另请注意,使用discarderr
会使调试“奇怪”问题变得更加困难。例如,您无法查看命令是否被执行根本不例如discarderr grap
(grep
拼写错误)不会输出任何内容。