如何跟踪参数解析和扩展?

如何跟踪参数解析和扩展?

zsh下面的示例说明了我将脚本视为“日常WTF”的情况。我几乎放弃了zsh充分理解大量规则的希望,以便能够自己解决这些令人困惑的案例,但我仍然希望找到一些设置、技术、工具或技巧,能够帮助我解决问题。至少帮我剖析发生了什么。本质上类似于使用调试器单步执行某些代码,或者查看其执行的痕迹。


我认为这${(%):-%x}只是 的一种可爱的简写${(%)NONEXISTENT:-%x},其中NONEXISTENT代表当前环境中未定义的任何标识符。事实上,看起来这是真的:

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"

结果:

% zsh /tmp/test
/tmp/test
/tmp/test

因此,出于同样的原因,我认为这${(%)-%x}只是 的一个可爱的简写${(%)NONEXISTENT-%x}

正如你现在可能预料到的那样,我错了。下面的脚本显示了这一点,该脚本只是用几行扩展了前面显示的脚本:

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"
echo "${(%)NONEXISTENT-%x}"
echo "${(%)-%x}"

结果:

% zsh /tmp/test
/tmp/test
/tmp/test
/tmp/test
569X

更神秘的是,详细信息取决于脚本是否运行或来源:

% source /tmp/test
/tmp/test
/tmp/test
/tmp/test
5679BJTVXgim

答案1

zsh文档有一个规则部分描述如何应用参数扩展。您可以坚持使用它来了解 shell 会做什么(据我所知,没有调试器可以做到这一点)。


你所认为的很对,但不是形式上的${(%)-%x},因为$-它是其中之一shell特殊变量,它扩展到 shell 选项。

因此,在 中${(%)-%x},shell 对 的%结果应用了标志,并删除了末尾的$-文字字符。x

相关内容