如果 ksh93 中的 DEBUG trap 语句包含 exit 或 return 语句,则首次运行后不会执行

如果 ksh93 中的 DEBUG trap 语句包含 exit 或 return 语句,则首次运行后不会执行

我试图编写一个简单的函数来检查配置文件是否已“清理”并且是否可以安全获取。我似乎只在第一次调用该函数时才使其在bash、 和(版本 ABIJM 93v-2014-06-25)中工作。ksh这是该函数的淡化版本,仍然为我重现了这个错误:

function sanitized_source
{ 
    typeset source_filename=$1
    (
        #shopt -s extdebug # Need this if using bash
        trap 'if [[ $? != 0 ]]; then return 66; fi' DEBUG
        PATH=.
        set -re
        . "${source_filename}"
    )
}

和配置文件:

cd /root || echo 'what?'
echo 'why is this executed?'

我如何运行它以及我所看到的:

% . ./dotfile
% sanitized_source test.conf
ksh: sanitized_source[79]: sanitized_source[1]: cd: restricted
% sanitized_source test.conf
ksh: sanitized_source[79]: .[1]: cd: restricted
what?
why is this executed?

其目的trap是涵盖set -e即使命令失败也不会退出 shell 的情况。从man bash

[设置]-e

[...] 如果失败的命令是在 && 或 || 中执行的任何命令的一部分,则 shell 不会退出列出最后 && 或 || 后面的命令除外[...]

外部调试

[...] 2. 如果 DEBUG 陷阱运行的命令返回非零值,则跳过下一个命令并且不执行。

我注意到参数.sh.command.sh.subshell在第一次和第二次调用之间发生了变化:

% sanitized_source test.conf
ksh: sanitized_source[9]: sanitized_source[1]: cd: restricted
% echo "${.sh.command}"
echo 'what?'
% echo "${.sh.subshell}"
0
% sanitized_source test.conf
ksh: sanitized_source[9]: .[1]: cd: restricted
what?
why is this executed?
% echo "${.sh.command}"     
`���2
% echo "${.sh.subshell}"    

%

另外,例如,如果我将returnorexit语句替换trapecho,我可以看到该trap语句每次都会被执行。

那么为什么这种行为只在 中观察到ksh而没有呢bash?根本原因是什么以及如何解决?

相关内容