让我们看一个例子:在我的 main.sh 中,我想获取 a.sh 和 b.sh。然而,a.sh 可能已经采购了 b.sh。因此它会导致 b.sh 中的代码执行两次。C++ 中是否有任何类似“包含守卫”的机制?
问问题
2114 次
3 回答
9
如果您正在采购脚本,您通常使用它们来定义函数和/或变量。
这意味着您可以通过测试它定义的(其中一个)函数或变量来测试该脚本是否已经被获取过。
例如(在b.sh
):
if [ -z "$B_SH_INCLUDED" ]
then
B_SH_INCLUDED=yes
...rest of original contents of b.sh
fi
据我所知,没有其他方法可以做到这一点。特别是,您不能提前退出或返回,因为这会影响 shell 获取文件。您不必使用仅用于文件的名称;您可以使用文件始终定义的名称。
于 2011-09-22T17:06:03.597 回答
8
在 bash 中,提前返回不会影响源文件,它会像当前文件是一个函数一样返回它。我更喜欢这种方法,因为它避免将整个内容包装在if...fi
.
if [ -n "$_for_example" ]; then return; fi
_for_example=`date`
于 2014-07-31T02:22:25.610 回答
1
我个人通常使用
set +o nounset # same as set -u
在我的大多数脚本上,因此我总是将其关闭并重新打开。
#!/usr/bin/env bash
set +u
if [ -n "$PRINTF_SCRIPT_USAGE_SH" ] ; then
set -u
return
else
set -u
readonly PRINTF_SCRIPT_USAGE_SH=1
fi
如果你不喜欢名词集,你可以这样做
[[ -n "$PRINTF_SCRIPT_USAGE_SH" ]] && return || readonly PRINTF_SCRIPT_USAGE_SH=1
于 2017-04-15T06:24:26.400 回答