使用zsh(或者通常使用shell脚本)的一个令人讨厌的方面是,如果您输入错误的变量名称,并且结果名称不存在,则会将其静默地视为空字符串,这会使错误变得困难发现:
if somecondition
then
myvar=55
else
my_var=66
fi
echo $MyVar # Oops
我知道此规则的存在是为了与旧的Bourne shell兼容。我也知道在访问变量时我可以明确地捕获此错误:
echo ${MyVar?NOT SET}
但是如果我在每次变量访问时都这样做,就会导致代码变得丑陋。由于我有习惯明确初始化我的所有变量,所以我正在寻找某种方式,当访问shell变量或环境变量时,zsh会自动溢出错误消息,而这些变量尚未设置。有没有办法做到这一点?我已经查看了zshoptions
手册页,但没有找到合适的内容。
答案 0 :(得分:2)
In not just zsh but other shells as well, set -u
makes references to unset variables an error.
That said, many scripts will not work unmodified when using this option: [[ $foo ]]
can no longer be used to check whether foo
was provided by the outer environment, requiring [[ ${foo-} ]]
instead.
答案 1 :(得分:1)
要模仿Charles Duffy的答案,并且在使用nounset
时作为此类测试的示例(在zsh shell中),您可以考虑这个git commit(对于git本身):<登记/>
请commit 34d8f5a查看Ville Skyttä (scop
)(2016年6月6日)
(由Junio C Hamano -- gitster
--于commit 8162401合并,2016年7月6日)
上出错
git-prompt.sh
:请勿在{{1}},${ZSH,BASH}_VERSION
当shell处于“
$short_sha
”或“nounset
”模式时,引用set -u
或unset
个变量会导致错误。
保护null
和$ZSH_VERSION
,并在使用前初始化$BASH_VERSION
。
$short_sha