最简洁有效的方式是在函数调用时重定向,无需修改函数本身;屏蔽stdout用> /dev/null,屏蔽stderr用2> /dev/null,同时屏蔽推荐>/dev/null 2>&1,顺序错误会导致stderr未被屏蔽。

直接在函数调用时重定向,是最简洁有效的方式。函数本身不需修改,靠调用时的重定向语法就能控制输出流向。
函数调用时加重定向符号
Shell 函数的标准输出(stdout)和标准错误(stderr)默认都指向终端。想屏蔽打印,只需在调用函数时加上重定向操作:
-
屏蔽标准输出:用
> /dev/null,例如myfunc > /dev/null -
屏蔽标准错误:用
2> /dev/null,例如myfunc 2> /dev/null -
同时屏蔽两者:推荐写法是
> /dev/null 2>&1,即先重定向 stdout 到黑洞,再让 stderr 指向 stdout 当前位置 - 简写形式
&> /dev/null在 Bash 中可用,但不是所有 Shell(如 dash、sh)都支持,脚本中建议避免
为什么不能写成 2>&1 > /dev/null
顺序很重要。重定向从左到右执行:
-
2>&1 > /dev/null先把 stderr 指向当前 stdout(即终端),再把 stdout 改为指向/dev/null——结果是 stderr 仍打到屏幕,stdout 被丢弃 - 正确顺序
> /dev/null 2>&1先让 stdout 进黑洞,此时 stderr 再指向它,两者都被丢弃
函数内部重定向(按需使用)
如果某个函数固定不需要输出,也可以在函数体内部统一重定向,避免每次调用都写:
- 在函数开头加
exec > /dev/null 2>&1,后续所有命令输出都会被静默 - 注意:
exec会改变整个函数的默认 I/O 流,返回前若需恢复,得提前保存并还原(较复杂,一般不必要) - 更稳妥的做法是只对特定命令重定向,比如
some_cmd > /dev/null 2>&1写在函数里
验证是否生效的小技巧
写个测试函数快速确认效果:
testfunc() {
echo "this goes to stdout"
echo "this goes to stderr" >&2
}
# 分别试试:
testfunc # 两行都显示
testfunc > /dev/null # 只剩 stderr 行
testfunc 2> /dev/null # 只剩 stdout 行
testfunc > /dev/null 2>&1 # 完全静默


















