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

时间:2016-01-04 14:19:11

标签: linux shell unix zsh

我有一个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设计总是解析$ *;我们不能告诉它使用不同的数组。

我知道我想要的东西有点像#34;吃蛋糕并且吃它也是#34; - 我的zparse.zsh有自己的参数列表,但也希望处理其父级的参数列表。

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

. zparse.zsh FOO BAR % "$@"

在zparse中,我首先将参数从$ *中移出魔术参数并转移到本地数组中,这样就留下了" $ @"现在它与调用脚本中的那个相同,并在此使用zparseopt。

我想知道是否有更简单的解决方案。例如,我可以以某种方式访问​​源shell的shell变量(以及$ *)吗?我不是在谈论访问父进程的环境,因为我们在这里处于同一个进程中。也许zsh及其所有好东西都有一些有用的功能,我只是不知道?

1 个答案:

答案 0 :(得分:1)

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

#!/usr/bin/zsh
outerargs=("$@")
. $HOME/slib/zparse.zsh FOO BAR
然而,这是IMO明显比你目前的解决方案更糟糕。事实上,我没有看到所谓的不平等:zparse.zsh明确表达它所使用的值(与魔术师在这个答案中演示的幕后技巧相反),如果你选择好你的分离器,就没有歧义。 / p>