是否可以在 Bash 中编写别名或函数来过滤掉错误(stderr)?

是否可以在 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可以消除错误消息的功能。但是其他命令的通用解决方案呢?

答案1

一种 shell 函数,执行作为一个或多个参数给出的命令并丢弃其标准错误流:

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

具有相同功能的别名:

alias discarderr='2>/dev/null'

两者的使用方式相同:

discarderr some-command

2>/dev/null...尽管从长远来看,这可能会混淆命令,并且比仅仅添加到命令更麻烦。例如,您必须记住在您使用的每个系统上实例化别名或函数,如果您在脚本中使用该函数,它会隐藏您正在丢弃来自浏览代码的人的诊断消息的事实。

此外,诊断消息是有用,并且理想情况下您应该纠正诸如死符号链接等问题,而不是解决它们在尝试通过它们访问数据的程序中导致错误的事实。

另请注意,使用discarderr会使调试“奇怪”问题变得更加困难。例如,您无法查看命令是否被执行根本不例如discarderr grapgrep拼写错误)不会输出任何内容。

相关内容