Linux中优雅报错退出需将错误输出到stderr并用非零退出码终止:用printf >&2输出错误,exit返回约定码(如2表示参数错误),可封装error函数,配合trap做清理。

在 Linux 系统中,优雅地打印错误提示并退出,核心是两件事:把错误信息清晰地输出到标准错误流(stderr),再用合适的退出码终止程序。这样既符合 POSIX 规范,又方便脚本调用方判断状态。
用 printf 或 echo 输出到 stderr
避免把错误信息混进标准输出(stdout),否则会被管道、重定向干扰。正确做法是显式重定向到文件描述符 2:
- printf "error: missing required argument\n" >&2
- echo "error: config file not found" >&2
推荐用 printf,它比 echo 更可移植(尤其在不同 shell 中行为一致),且支持格式化,比如带变量:printf "error: %s is invalid\n" "$input" >&2。
配合 exit 返回有意义的退出码
仅打印错误不够,必须让调用者知道发生了什么。Linux 习惯用非零退出码表示失败,常见约定:
- exit 1:通用错误
- exit 2:命令行参数错误(如 getopt 解析失败)
- exit 126:命令不可执行
- exit 127:命令未找到
例如:printf "error: --port must be a number\n" >&2; exit 2。
封装成 error 函数复用
在脚本开头定义一个简短函数,提升可读性和一致性:
- error() { printf "error: %s\n" "$*" >&2; }
- 使用:error "failed to connect to database"; exit 1
加一句 set -e 可让脚本在任何命令失败时自动退出,但需注意它不捕获函数内部的 exit,所以仍建议显式写 exit。
退出前做必要清理(可选但推荐)
如果脚本创建了临时文件、打开网络连接或持有锁,应在退出前释放。用 trap 注册清理动作:
- trap 'rm -f /tmp/mytemp.$$' EXIT
- trap 'echo "cleanup done"; exit 1' INT TERM
这样无论是正常 exit、用户按 Ctrl+C(SIGINT),还是被 kill -15(SIGTERM),都能保证资源清理。











