如何在Bash脚本中避免控制台打印错误?输入无效参数直接退出
解决Shell脚本中无效参数静默退出的问题
我懂你的需求——当用户传入像.这种无效参数给脚本时,不想让终端跳出sleep的错误提示,直接让程序静默退出对吧?
问题根源
你之前用的sleep $sleep_time > /dev/null只把**标准输出(stdout)重定向到了/dev/null,但sleep的错误信息是输出到标准错误(stderr)**的,所以错误还是会显示在屏幕上。
修复方案
我们需要把stderr也一起重定向到/dev/null,同时可以优化判断逻辑让代码更简洁:
- 重定向所有输出:用
&>/dev/null(bash兼容)或者> /dev/null 2>&1(POSIX兼容),这样stdout和stderr都会被丢弃。 - 直接用命令的返回值做判断:不用单独检查
$?,shell里if 命令; then会直接判断命令是否执行成功,代码更清爽。 - 给变量加双引号:避免参数包含空格或特殊字符时出现意外问题,这是shell脚本的最佳实践。
修改后的代码片段
if [ -n "$1" ]; then sleep_time="$1" # 重定向所有输出到/dev/null,静默执行sleep if sleep "$sleep_time" &>/dev/null; then measurement "$sleep_time" else exit fi # 若未传入参数,则从用户处获取刷新间隔 else echo "Proper Usage: $0 refresh_interval(in seconds)" read -p "Please Provide the Update Time: " sleep_time if sleep "$sleep_time" &>/dev/null; then measurement "$sleep_time" else exit fi fi
额外说明
如果想让退出时完全没有任何输出,上面的修改就足够了——无效参数时sleep的错误会被吞掉,程序直接退出。另外,&>/dev/null是bash的简写,如果你需要兼容所有POSIX shell,换成> /dev/null 2>&1就行,效果是一样的。
内容的提问来源于stack exchange,提问作者user9156891
相关产品推荐
相关产品推荐

