【发布时间】:2020-04-08 14:22:59
【问题描述】:
我有一个 bash 脚本 a.sh,看起来像这样:
#!/bin/bash
echo $#
echo $1
还有一个脚本b.sh,看起来像这样:
#!/bin/bash
source ./a.sh
如果我调用 ./a.sh 我正确地得到 0 和一个空行作为输出。调用 ./a.sh blabla 时,我得到 1 和 blabla 作为输出。
但是,当我调用 ./b.sh blabla 时,我也会得到 1 和 blabla 作为输出,即使在 b.sh 内没有将任何参数传递给 a.sh。
这似乎与source 的使用有关(我必须使用它,因为在我的实际用例中,a.sh 导出了一些变量)。如何避免来自b.sh 的参数被传播到a.sh?我考虑过使用eval $(a.sh),但这使我在a.sh 中的echo 语句失败。我想在调用a.sh之前使用shift来使用来自b.sh的参数,但我不一定知道有多少参数。
【问题讨论】:
-
这不是从
b传播到a的参数。这是从b到a的代码。这就是source存在的原因。否则,在子 shell 中的标准执行就足够了。 -
那么不要使用
source。#!/bin/bash ./a.sh -
你可以在采购之前转移:
for arg in "$@"; do shift; done -
我这样做的原因
source是我需要在a.sh中导出的变量,以便以后在b.sh中可用。 -
所以你基本上是想让a.sh改变b.sh的环境,同时也阻止a.sh访问b.sh的环境。这怎么可能?
标签: bash