在Bash中,我们可以使用$?
变量捕获上一个命令的退出状态码。如果命令成功执行,那么退出状态码为0,如果命令执行失败,则退出状态码为非零值。
当在Bash脚本中使用陷阱(trap)来捕获错误时,可以通过设置$?
变量的值来判断命令是否成功执行,并且可以保存失败命令的参数值。
以下是一个示例代码,演示了如何使用Bash的陷阱来捕获错误,并且保留失败命令的参数值:
#!/bin/bash
# 定义错误处理函数
handle_error() {
local error_code=$?
local command="${BASH_COMMAND}"
local line_number="${BASH_LINENO}"
local file_name="${BASH_SOURCE[1]}"
echo "命令执行失败: ${command}"
echo "错误码: ${error_code}"
echo "命令行号: ${line_number}"
echo "文件名: ${file_name}"
}
# 设置陷阱,当命令执行失败时,调用错误处理函数
trap 'handle_error' ERR
# 一个会失败的命令示例
ls /path/to/non_existent_directory
# 另一个会失败的命令示例,使用参数
rm non_existent_file
在上面的代码中,我们定义了一个handle_error
函数作为错误处理函数。当陷阱(trap)捕获到错误时,它会调用该函数。函数中,我们使用$?
变量获取命令的退出状态码,$BASH_COMMAND
变量获取当前正在执行的命令,$BASH_LINENO
变量获取命令所在的行号,$BASH_SOURCE
数组获取命令所在的文件名。
请注意,陷阱(trap)只会对当前Shell及其子Shell中执行的命令生效。如果在一个子Shell中执行命令,并且想要在父Shell中捕获错误,可以使用set -e
命令开启全局错误检查。
希望以上解决方法对你有帮助!