zsh 5.9中数组赋值$!行为异常,是特性还是回归?
zsh 5.9中$!赋值给数组元素的行为解析
先看你给出的测试代码:
unset a b c sleep 3 & a=$! b[1]=$! c[1]=${!} typeset -p a b c
输出结果:
typeset a=21391 typeset -a b=( '$!' ) typeset -a c=( 21391 )
原因解析
这是zsh的特性,并非回归问题。
zsh在处理数组元素赋值(b[1]=$!)时,对$!的解析逻辑和普通变量赋值(a=$!)存在差异:
- 普通变量赋值上下文里,
$!会直接展开为最后一个后台命令的PID。 - 但在数组下标赋值的右侧,未加显式参数展开标记的
$!会被当作字面量处理,不会触发展开。而${!}是显式的参数展开语法,明确触发了参数解析逻辑,因此能正确获取到PID。
如果需要让数组元素赋值时正常展开$!,可以用以下两种方式:
- 使用显式参数展开:
b[1]=${!}(和变量c的写法一致) - 对
$!添加引号:b[1]="$!"
结论
这种行为是zsh语法解析规则的一部分,属于特性范畴,不是版本回归导致的问题。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

