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

Shell 使用zsh中的源内置项读取脚本中的位置参数,shell,zsh,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 我在上面的脚本中

在我的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参数?

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

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

ROOT_SYS=`setup.sh`

最后,正如您所了解的,
source
关键字也允许为脚本提供参数,但如果您没有提供任何参数,它会绕过当前参数。

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

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

ROOT_SYS=`setup.sh`

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

过去,unix shell不允许将任何参数传递给使用
内置函数调用的脚本(
source
是bash、ksh和zsh中可用的
的别名。
内置的意思是“就像此文件实际包含在这里一样”

在bash、ksh和zsh中,如果向内置的
传递额外的参数,它们将成为位置参数(
$1
等等)在源代码脚本中。如果传递零个参数,则主脚本的位置参数仍然有效。在这些shell中,
的行为相当类似于调用函数,尽管并不完全如此(特别是在bash中,如果修改子脚本中的位置参数,则修改会被主脚本看到)


避免这种困难的一个简单方法是只定义函数(可能还有变量)在下标中。将其视为一个代码库,这样仅对其进行寻源不会产生任何效果,然后从子脚本调用函数以实际执行某些操作。

过去,unix shell不允许将任何参数传递给使用内置的
调用的脚本(
source
是bash、ksh和zsh中可用的
的别名。
内置的意思是“就像此文件实际包含在这里一样”

在bash、ksh和zsh中,如果向内置的
传递额外的参数,它们将成为位置参数(
$1
等等)在源代码脚本中。如果传递零个参数,则主脚本的位置参数仍然有效。在这些shell中,
的行为相当类似于调用函数,尽管并不完全如此(特别是在bash中,如果修改子脚本中的位置参数,则修改会被主脚本看到)


避免这种困难的一个简单方法是只定义函数(可能还有变量)在下标中。将其视为一个代码库,这样仅对其进行寻源就没有任何效果,然后从子脚本调用函数来实际执行某些操作。

谢谢Diego。因此,在我的脚本中,我可以使用./setup.sh而不是source setup.sh?source setup.sh在shell中设置一个命令(设置路径等)我在脚本中使用的./setup(我看不出为什么不这样做)?如果您的脚本实际设置了要在调用脚本中使用的变量,您必须
source
它,但是,要么读取脚本忽略命令行参数,要么您显式提供它们。谢谢Diego。我刚刚将参数添加到我的setup.sh中,因为我需要使用SourceThank Diego。因此,在我的脚本中,我可以只/setup.sh inssource setup.sh的tead?source setup.sh在shell中设置了一个命令(设置路径等),我在脚本中使用了该命令。/setup(我不明白为什么不这样做)?如果您的脚本实际设置了要在调用脚本中使用的变量,您必须
source
它,但是,要么读取脚本忽略命令行参数,要么您显式提供它们。谢谢Diego。我刚刚将参数添加到我的setup.sh中,因为我需要使用source