8

让我们看一个例子:在我的 main.sh 中,我想获取 a.sh 和 b.sh。然而,a.sh 可能已经采购了 b.sh。因此它会导致 b.sh 中的代码执行两次。C++ 中是否有任何类似“包含守卫”的机制?

4

3 回答 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 回答