为何zsh中需用${(%):-%N}而非${(%)%N}展开%转义?
为什么${(%)%N}不生效,必须用${(%):-%N}?
先明确zsh参数扩展的两种核心结构:
${(flags)parameter}:这里的parameter是要扩展的参数名,flags是对该参数的值做处理的标志。${parameter:-value}:当parameter为空或未定义时,返回value;若parameter有值,则返回其值。
现在拆解你的疑问:
${(%)%N}里,%N被当成了参数名,zsh会尝试寻找名为%N的变量——显然你没定义过这个变量,所以扩展结果为空。(%)标志仅作用于参数的值,对参数名本身无效,因此这里的%N不会被解析成脚本路径。${(%):-%N}是两种结构的结合::-左侧的参数名为空,必然返回右侧的%N;(%)标志会让右侧的value(即%N)像在zsh提示符里那样解析转义序列,此时%N才会被替换为当前运行脚本的路径。
简单总结:%N不是合法参数名,是需要被解析的转义字符串,必须放在:-的value位置,才能被(%)标志触发解析;直接把它当参数名用,zsh找不到对应变量,自然没有有效结果。
内容的提问来源于stack exchange,提问作者JezuzStardust
相关产品推荐
相关产品推荐

