Shell脚本中是否有任何机制在C ++中使用“include guard”?

时间:2011-09-22 16:57:26

标签: shell include-guards

让我们看一个例子:在我的main.sh中,我想找一个a.sh和b.sh.但是,a.sh可能已经采购了b.sh.因此,它将导致b.sh中的代码执行两次。在C ++中是否有类似“包含保护”的机制?

3 个答案:

答案 0 :(得分:7)

如果您正在寻找脚本,通常会使用它们来定义函数和/或变量。

这意味着您可以通过测试(定义)其定义的函数或变量来测试脚本是否已经来源。

例如(在b.sh中):

if [ -z "$B_SH_INCLUDED" ]
then
    B_SH_INCLUDED=yes
    ...rest of original contents of b.sh
fi

我知道没有其他方法可以做到这一点。特别是,您不能进行早期退出或返回,因为这会影响shell获取文件。您不必使用仅用于文件的名称;您可以使用文件始终定义的名称。

答案 1 :(得分:6)

在bash中,提前返回不会影响源文件,它会返回到它,就好像当前文件是一个函数一样。我更喜欢这种方法,因为它避免将整个内容包装在if...fi

if [ -n "$_for_example" ]; then return; fi
_for_example=`date`

答案 2 :(得分:0)

我个人经常使用

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

如果你不喜欢nounset,你可以这样做

[[ -n "$PRINTF_SCRIPT_USAGE_SH" ]] && return || readonly PRINTF_SCRIPT_USAGE_SH=1