我有一些库代码可能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