使用zsh中内置的源读取脚本中的位置参数

时间:2011-09-21 10:39:30

标签: shell zsh

在我的shell脚本中获取另一个脚本时,我注意到了一些奇怪的行为。我在shell脚本中设置环境的脚本采用可选参数,例如

source setup.sh version1

但是在我的shell脚本中,我还有命令行参数变量。例如:

./myscript.sh TEST 1

内部myscript.sh

#!/bin/zsh
source setup.sh
echo ROOT version setup $ROOT_SYS
...more of the script

我在上面的脚本中注意到的问题是$1命令中使用了TEST参数(本例中为source setup.sh)。这会导致命令变为

source setup.sh TEST

当然失败,因为setup.sh没有版本TEST

我通过将脚本编辑到下面解决了这个问题。

#!/bin/zsh
source setup.sh version1
echo ROOT version setup $ROOT_SYS
...more of the script

source命令现在不会获取$1参数。

为什么/当我运行shell脚本时,source命令如何获取$ 1参数?

2 个答案:

答案 0 :(得分:3)

从历史上看,unix shell不允许将任何参数传递给使用.内置调用的脚本(source是bash,ksh中可用的.的别名。 zsh中)。 .内置的意思是“就像这个文件实际包含在这里一样”。

在bash,ksh和zsh中,如果将额外的参数传递给.内置函数,它们将成为源代码脚本中的位置参数($1等)。如果传递零参数,则主脚本的位置参数仍然有效。在这些shell中,.的行为与调用函数非常相似,但并不完全如此(特别是在bash中,如果修改子脚本中的位置参数,则主脚本可以看到修改)。 / p>

避免这种困难的一种简单方法是只在下标中定义函数(也许是变量)。将它视为一个代码库,这样只需获取它就没有效果,然后从子脚本中调用函数来实际执行某些操作。

答案 1 :(得分:2)

这是因为源执行setup.sh的代码就好像它已就位一样,所以当setup.sh访问时,比如$1,它的值就是第一个参数的值实际的脚本。如果你想避免它,你可以执行它:

setup.sh

或者,如果您需要从中获取一些变量或值,请将其更改为以输出形式返回结果,如:

ROOT_SYS=`setup.sh`

最后,正如您所知,source关键字还允许为脚本提供参数,但如果您不提供任何参数,它会绕过当前参数。