在 zsh 脚本中捕获错误时捕获错误消息

问题描述 投票:0回答:1

我有一个 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 
error-handling zsh trap
1个回答
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 函数中,我们检查退出状态是否非零。如果是这样,我们从临时日志文件中打印错误消息。

使用临时文件:此方法可确保在诊断阶段捕获并打印错误消息。

通过运行此脚本,您应该能够在发生错误时看到错误消息以及变量值。

© www.soinside.com 2019 - 2024. All rights reserved.