使用 zsh 排版可以产生一些可能的结果:
- 没有错误,有效(是的!)。
- 错误,脚本失败(修复!)。
- 没有错误,但有意外行为。 (抓头)
作为最后一个类别的示例,这不会产生错误,但 typeset -p 显示 -i 被忽略。
{
unset int_array
typeset -ia int_array
int_array=(1 2 3)
echo $? "-Point A"
typeset -p int_array
} always {
echo $? "-Point B"
typeset -p int_array
(( TRY_BLOCK_ERROR=0 ))
}
echo $? "-Point C"
echo "survived"
产生
0 -Point A
typeset -a int_array=( 1 2 3 )
0 -Point B
typeset -a int_array=( 1 2 3 )
0 -Point C
survived
第一行取消设置 int_array。排版命令声明
int_array 既是数组又是 int,这不是 zsh 允许的。下一个
行将 int_array 分配给一个值。 $? 告诉我们没有错误,
但仔细检查最终的 typeset -p int_array 揭示了实际情况
发生了。
稍作改动,我们就可以产生错误并使用always 块和
typeset -p 查找更多详细信息。
{
unset int_array
typeset -ia int_array=(1 2 3) # error
echo $? "-Point A"
typeset -p int_array
} always {
echo $? "-Point B"
typeset -p int_array
(( TRY_BLOCK_ERROR=0 ))
}
echo $? "-Point C"
echo "survived"
040_declare_version2.sh:typeset:135: int_array: inconsistent type for assignment
1 -Point B
040_declare_version2.sh:typeset:140: no such variable: int_array
1 -Point C
survived
唯一的区别是 int_array 在错误的typeset -ia 语句中被赋予了一个值。
这会产生错误,并且脚本会跳转到always block.
(( TRY_BLOCK_ERROR=0)) 允许脚本继续
并没有终止,但是在“C点”仍然报错。
查看shell版本:
$SHELL --version
zsh 5.4.2 (x86_64-ubuntu-linux-gnu)