zsh:退出 sh/ksh 模拟以进行参数扩展

zsh:退出 sh/ksh 模拟以进行参数扩展

我有一些库代码可能zsh在( set)下运行ZSH_VERSION,但是调用者的zsh 可能处于sh/ksh仿真模式。我需要 zsh 参数扩展(例如列出所有变量),所以我尝试使用emulate zsh -c ...

export code='print -rl -- ${(k)parameters}'
zsh --emulate  sh -c 'emulate zsh -c "$code"'  # nothing
zsh --emulate ksh -c 'emulate zsh -c "$code"'  # nothing
zsh --emulate zsh -c 'emulate zsh -c "$code"'  # useless, but works
# emulate -[LR] zsh make no difference

那么...一旦进入sh/ksh仿真,我就暂时无法退出了?

答案1

您可以退出 (k)sh 模拟。emulate内置命令仅设置了一些选项:它是一个很长的、与 zsh 版本相关的setopt命令的快捷方式,加上一些设置以获得所需的范围。

使用该--emulate选项启动 zsh 的作用不仅仅是设置一些选项。这手动的不幸的是,对此含糊其辞:

请注意,与 shell 中的 emulate 命令相比,使用此选项时需要采取某些额外步骤来确保顺利仿真:例如,与 POSIX 使用冲突的变量(例如路径)不会在 shell 中定义。

--emulate sh加载时未发生或--emulate ksh正在加载的事情之一模块例如zsh/parameter其中提供了$parameters.如果您需要,即使 zsh 在模拟模式下启动,您也需要显式加载它。对比:

$ zsh --emulate sh -c 'emulate zsh -c "echo \${(k)modules}"'
$ zsh --emulate sh -c 'zmodload zsh/parameter; emulate zsh -c "echo \${(k)modules}"'
zsh/parameter zsh/main zsh/rlimits

所以:

$ export code='zmodload zsh/parameter; print -rl -- ${(k)parameters}'
$ zsh --emulate  sh -c 'emulate zsh -c "$code"'
galiases
EGID

相关内容