【发布时间】:2011-11-23 00:46:26
【问题描述】:
让我们看一个例子:在我的 main.sh 中,我想获取 a.sh 和 b.sh。然而,a.sh 可能已经采购了 b.sh。因此它会导致 b.sh 中的代码执行两次。 C++中是否有类似“include guard”的机制?
【问题讨论】:
-
您可以设置一个变量并将其用作警卫
标签: shell include-guards
让我们看一个例子:在我的 main.sh 中,我想获取 a.sh 和 b.sh。然而,a.sh 可能已经采购了 b.sh。因此它会导致 b.sh 中的代码执行两次。 C++中是否有类似“include guard”的机制?
【问题讨论】:
标签: shell include-guards
我个人经常使用
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
【讨论】:
在 bash 中,提前返回不会影响源文件,它会像当前文件是一个函数一样返回它。我更喜欢这种方法,因为它避免将整个内容包装在 if...fi 中。
if [ -n "$_for_example" ]; then return; fi
_for_example=`date`
【讨论】:
如果您正在采购脚本,您通常使用它们来定义函数和/或变量。
这意味着您可以通过测试其定义的(其中一个)函数或变量来测试该脚本是否已被获取过。
例如(b.sh):
if [ -z "$B_SH_INCLUDED" ]
then
B_SH_INCLUDED=yes
...rest of original contents of b.sh
fi
据我所知,没有其他方法可以做到这一点。特别是,您不能提前退出或返回,因为这会影响 shell 获取文件。您不必使用仅用于文件的名称;您可以使用文件始终定义的名称。
【讨论】:
-z "${B_SH_INCLUDED+x}"来代替会更好。