如果我有一个包含函数的文件foo
,并且我有以下流程:脚本
Asources
包含foo
并调用foo
.
然后脚本 A 执行另一个也调用foo
.第二个脚本也来源相同的文件。
我想知道是否有一种方法可以在第二个脚本中有条件地获取文件,或者没有影响并且这种方法很常见?
答案1
如果脚本 A 执行其他内容,则该程序不会继承函数定义。 Bash 有一个不起眼的功能,可以通过环境导出函数。在实现中出现漏洞之前,这一点基本上是未知的。如果您确实需要,可以使用 导出函数export -f
,但最好只定义要使用的函数,而不是依赖环境中存在的这些函数。
答案2
正如 RalfFriedl 已经解释的那样,这是否会产生一些影响,取决于源脚本内实际执行的内容。由于您没有告诉我们该脚本的内容,因此我们无法判断这是否有影响。
无论如何,我认为在第二个脚本中进行这种类型的检查是糟糕的设计。源脚本应该以幂等的方式编写 - 我应该被允许尽可能频繁地源脚本,而不会受到任何惩罚。
很少有事情我们希望“只发生一次”。一个典型的情况是向 iePATH
或附加一些内容LD_LIBRARY_PATH
。如果我们多次获取脚本,路径会变得越来越长。如果我们想避免这种情况,保护应该进入源脚本,而不是源脚本。我经常使用的一个模式是这样的:
# Put /foo/bar on top of PATH
: ${_src_xyz_version:=1}
if [[ ${_SRC_XYZ:=0} != $_src_xyz_version ]]
then
export _SRC_XYZ=$_src_xyz_version
export PATH=/foo/bar:$PATH
fi
在这种情况下,一旦扩展了 PATH,在我的进程或任何子进程中再次运行脚本不会再次修改 PATH,除非进程通过执行以下操作显式更改请求
export _SRC_XYZ=0