【问题标题】:Include script only once in shell script在 shell 脚本中只包含一次脚本
【发布时间】:2014-07-21 02:46:15
【问题描述】:

我想将文件作为“支持”脚本包含到 shell 脚本中。既然他们设置了东西并检查了环境,我只想让他们执行一次。

我的方法是创建一个全局数组,检查该数组中是否存在脚本名称。如果没有,请将其添加到数组中并“获取”外部文件。

当前代码如下所示:

 function array_contains() { # array, value
    local element
    for element in $1; do
        [[ "$element" == "$2" ]] && return 0
    done

    return 1
}

declare -a LOADED_SUPPORT_SCRIPTS

function require_support() { # file
    # Check if we loaded the support already
    array_contains ${LOADED_SUPPORT_SCRIPTS[@]} $1 && return 0

    # Add loaded support to array
    LOADED_SUPPORT_SCRIPTS=("${LOADED_SUPPORT_SCRIPTS[@]}" "$1")

    log -i "Including support for '$1'"
    source "$BASE_DIR/supports/$1.sh"

    return 1
}

虽然这在理论上应该可行(至少对我而言),但这段代码每次都会失败。不知何故,数组被重置(即使我从未在其他地方访问它)并且总是在开头包含一个“/”条目。

通过进一步搜索我的问题,我发现this "solution" 在我想要包含的每个脚本中都需要一个新的变量名 - 就像 C/C++ 一样。虽然这确实是一个好主意,但我希望我的代码尽可能小,但我并不真正关心数组迭代的性能。

我真的很想知道是否有替代方法,或者我在代码中做错了什么可以修复。提前致谢!

【问题讨论】:

标签: bash shell


【解决方案1】:

也许您可以尝试使用 Shell Script Loader。在著名的类似线程中查看有关它的帖子:https://stackoverflow.com/a/3692080/445221

【讨论】:

    【解决方案2】:

    您可以只检查您希望由支持脚本创建的功能是否存在。例如,如果您以它们包含的(至少一种)方法命名支持脚本:

    for path in supports/*.sh
    do
        file="$(basename "$path")"
        function="${file%.sh}"
        if ! declare -F "$function"
        then
            source "$path"
        fi
    done
    

    【讨论】:

      【解决方案3】:

      您不需要对“采购方”进行控制,您可以拥有自己的脚本控制。

      只需将以下内容添加到您只想获取一次的脚本的开头(将“MY_LIB”替换为某个唯一名称):

      [ -n "${MY_LIB}" ] && return; MY_LIB=0; # pragma once
      

      如果您稍后想要启用再次获取它的选项,您可以使用:

      unset MY_LIB
      

      如果您想动态检查脚本是否在您的客户端脚本中可用,请使用相同的基本逻辑:

      if [ -n "${MY_LIB}" ] then
          # use the lib
      else
          # use some alternate solution...
      fi
      

      或者,对于一个班轮:

      [ -n "${MY_LIB}" ] && echo "do something here using the lib";
      

      【讨论】:

        【解决方案4】:

        @BuvinJ 我喜欢你的解决方案,但我让它工作的唯一方法是添加 export 喜欢:

        [ -n "${MY_LIB}" ] && return; export readonly MY_LIB=0;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          • 2014-06-01
          • 2021-01-10
          • 2015-04-09
          相关资源
          最近更新 更多