使用 zparseopts 解析参数,但来自源脚本

Parsing parameters with zparseopts, but from within a sourced script

我有一个 zsh 脚本 myscr.zsh,它使用另一个脚本 zparse.zsh,像这样:

#!/usr/bin/zsh
# This is mysrc.zsh
. $HOME/slib/zparse.zsh FOO BAR # some parameters passed to zparse.zsh

zparse.zsh 需要可变数量的参数,这些参数不需要使用 zparseopt 进行解析,但是 zparse.zsh 应该 - 除其他事项外 - 解析传递给 mysrc.zsh 的位置参数.这很棘手,因为 mysrc.zsh 有自己的 $ 副本,这与 zparse.zsh 中的 $ 不同。

为了让事情变得更加困难,zparseopt 按照设计总是解析 $*;我们不能告诉它使用不同的数组。

我知道我想要的有点像"having a cake and eating it too"——我的zparse.zsh有自己的参数列表,但也想处理它parent的参数列表

我目前的,而不是优雅的方法是这样的:我定义了一个特殊的 "magic" 参数(比如:%),已知它不会出现在给定的参数列表中zparse.zsh。然后我这样调用 zparse.zsh:

. zparse.zsh FOO BAR % "$@"

在 zparse 中,我首先将参数移到 $* 之外的魔术参数并放入本地数组,这让我得到“$@”,它现在与调用脚本中的相同,然后使用 zparseopt关于这个。

不知道有没有更简单的解决办法。例如,我能否以某种方式访问​​采购 shell 的 shell 变量(以及 $*)?我说的不是访问父进程的环境,因为我们这里是同一个进程。也许 zsh 及其所有优点都有一些有用的功能,我只是不知道?

您可以将外部脚本的 $@ 复制到另一个数组中并在 zparse.zsh:

中使用它
#!/usr/bin/zsh
outerargs=("$@")
. $HOME/slib/zparse.zsh FOO BAR

但是,在我看来,这比您当前的解决方案要差得多。事实上,我没有看到所谓的不优雅:zparse.zsh 明确说明了它所使用的值(与此答案中演示的魔术师的 behind-the-back 技巧相反)并且如果你选择了合适的分隔符就没有歧义.