我有一个 zsh 脚本,它很少崩溃,并且日志中没有显示任何错误。 通常会出现错误消息。 我正在编写一个小型测试脚本并学习陷印。
我想在出现错误时打印变量值,但我也想捕获错误消息。当我以交互方式除以 0 时,我得到
zsh: division by 0
,但是当我在脚本中执行此操作时,我没有收到此类错误消息输出到 stdout 或 stderr。 我怎样才能得到它?
这是测试脚本:
#!/usr/bin/zsh
# Testing use of trap to print variables for diagnosis
# if script fails
set -o err_return
trap err.diagnostics EXIT
function err.diagnostics {
DATE=$(date +"%A, %b %d, %H:%M:%S")
printf '**************\n %s \n There has been an error \n Current variable values follow \n************** \n' $DATE
printf ' A: %f \n B: %d \n C: %f \n D: %d \n Z: %d \n' $A $B $C $D $Z
}
function do_stuff {
A=1.2
B=2
Z=0
(( C = A + B ))
(( D = C / Z ))
}
do_stuff
输出为:
jim@Tabernacle:~/ > test.zsh
**************
Friday, May 24, 12:39:41
There has been an error
Current variable values follow
**************
A: 1.200000
B: 2
C: 3.200000
D: -9223372036854775808
Z: 0
为了实现在 zsh 脚本中发生错误时捕获并打印错误消息以及变量值的目标,您需要在脚本中显式处理错误。陷阱机制对于在脚本退出或接收到某些信号时执行命令很有用,但它本身不会捕获错误消息。
这是脚本的改进版本,用于捕获和打印错误消息:
#!/usr/bin/zsh
# Testing use of trap to print variables for diagnosis
# if script fails
set -o err_return
trap 'err.diagnostics $?' EXIT
function err.diagnostics {
EXIT_STATUS=$1
DATE=$(date +"%A, %b %d, %H:%M:%S")
printf '**************\n %s \n There has been an error with exit status %d \n Current variable values follow \n************** \n' "$DATE" "$EXIT_STATUS"
printf ' A: %f \n B: %d \n C: %f \n D: %d \n Z: %d \n' $A $B $C $D $Z
if (( EXIT_STATUS != 0 )); then
printf 'Error message: %s\n' "$(cat /tmp/error_log)"
fi
}
function do_stuff {
A=1.2
B=2
Z=0
(( C = A + B )) 2>/tmp/error_log
(( D = C / Z )) 2>/tmp/error_log
}
do_stuff
变更说明:
修改 trap 命令:修改 trap 命令,将最后一个命令的退出状态($?)传递给 err.diagnostics 函数。
错误日志记录:可能会失败的命令(如 (( D = C / Z )))被重定向到临时错误日志文件 (/tmp/error_log)。这捕获了这些命令生成的错误消息。
错误状态检查:在 err.diagnostics 函数中,我们检查退出状态是否非零。如果是这样,我们从临时日志文件中打印错误消息。
使用临时文件:此方法可确保在诊断阶段捕获并打印错误消息。
通过运行此脚本,您应该能够在发生错误时看到错误消息以及变量值。