Bash:检测脚本中的执行与源?

Bash:检测脚本中的执行与源?

我的文件系统中到处都是一个脚本(构建过程的副作用),它设置了一些全局环境变量(LD_LIBRARY_PATH、PATH、ROOTDIR 等),这些变量需要在我的 shell 中才能正常运行。当然,这意味着我需要source script.sh. script.sh才能使其工作,而不是./script.sh(这将生成一个新的 shell 并且不会在我当前的 shell 中设置变量)。

我可以在脚本中添加什么内容吗防止(或警告)有人跑步./script.sh

答案1

在 shell 脚本中,$0是当前正在运行的脚本的名称。您可以使用它来判断您正在被调用还是运行,如下所示:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    >&2 echo "Don't run $0, source it"
    exit 1
fi

答案2

最简单的方法bash是:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE始终包含脚本的名称/路径。

$0仅在没有来源时包含脚本的名称/路径。

因此,当它们匹配时,就意味着该脚本没有来源。

答案3

这已经讨论过了在 SO。 这@barroyo 获得最多点赞的回答说使用

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."

答案4

除了支票 0 美元(米克尔例如,将扩展名从 .sh 更改为 .src 可能会很有用。这将有助于了解不应执行此脚本的任何人。

相关内容