我试图编写一个简单的函数来检查配置文件是否已“清理”并且是否可以安全获取。我似乎只在第一次调用该函数时才使其在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}"
%
另外,例如,如果我将return
orexit
语句替换trap
为echo
,我可以看到该trap
语句每次都会被执行。
那么为什么这种行为只在 中观察到ksh
而没有呢bash
?根本原因是什么以及如何解决?