linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现:
1. 使用 $?
检查上一条命令的退出状态
- 每个命令执行后,Shell 会将其退出状态存储在特殊变量
$?
中。 $?
的值为0
表示成功,非0
表示失败。
示例:
#!/bin/bash
command1
command2
command3
# 检查整个脚本是否有错误
if [ $? -ne 0 ]; then
echo "Error: Some command failed!"
exit 1
else
echo "All commands executed successfully!"
fi
2. 使用 set -e
使脚本在遇到错误时立即退出
set -e
会让脚本在任何命令失败时立即退出。- 这样可以避免手动检查每个命令的退出状态。
示例:
#!/bin/bash
set -e # 开启错误退出
command1
command2
command3
echo "All commands executed successfully!"
注意事项:
- 如果某些命令可能会失败,但你希望脚本继续执行,可以使用
|| true
忽略错误:command1 || true
3. 使用 trap
捕获错误并执行清理操作
trap
可以在脚本退出时捕获错误,并执行指定的清理操作。- 结合
set -e
使用效果更佳。
示例:
#!/bin/bash
set -e # 开启错误退出
# 定义错误处理函数
cleanup() {
echo "Error: Script failed!"
# 执行清理操作,如删除临时文件
}
# 捕获 EXIT 信号
trap cleanup EXIT
command1
command2
command3
echo "All commands executed successfully!"
4. 记录错误日志
- 可以将错误信息重定向到日志文件,方便后续排查。
示例:
#!/bin/bash
LOG_FILE="script.log"
# 将标准输出和错误输出重定向到日志文件
exec > >(tee -a "$LOG_FILE") 2>&1
command1
command2
command3
if [ $? -ne 0 ]; then
echo "Error: Some command failed! Check $LOG_FILE for details."
exit 1
else
echo "All commands executed successfully!"
fi
5. 总结
方法 | 适用场景 |
---|---|
$? | 手动检查每个命令的退出状态,适合简单的脚本。 |
set -e | 自动退出脚本,适合希望快速失败的场景。 |
trap | 捕获错误并执行清理操作,适合需要资源管理的场景。 |
记录日志 | 将错误信息保存到日志文件,适合需要排查问题的场景。 |
6. 推荐方案
结合 set -e
和 trap
是最常用的方式,既能快速失败,又能执行清理操作:
#!/bin/bash
set -e # 开启错误退出
cleanup() {
echo "Error: Script failed!"
# 执行清理操作
}
trap cleanup EXIT
command1
command2
command3
echo "All commands executed successfully!"
通过以上方法,你可以有效地检查脚本是否执行成功,并在失败时采取相应的措施。
其它方法
将错误信息重定向输出到日志中,在结束后检查日志是否出现错误信息,可能存在一些无效的警告等信息在里面,需要过滤
./cmd.sh 2>err.log