Bash:在脚本中检测执行与源代码?


19

我有一个遍布文件系统的脚本(生成过程的副作用),该脚本设置了一些全局环境变量(LD_LIBRARY_PATH,PATH,ROOTDIR等),这些变量必须位于我的shell中才能正常运行。当然,这意味着我需要source script.sh. script.sh必须使其起作用,而不是./script.sh(这将产生一个新的shell,并且不会在当前shell中设置变量)。

我有什么可以添加到脚本中以阻止(或警告)某人运行的./script.sh吗?

Answers:


15

在外壳程序脚本中,$0是当前正在运行的脚本的名称。您可以使用它来告诉您是源还是像这样运行:

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

5

最简单的方法bash是:

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

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

$0 不包含源代码时,仅包含脚本的名称/路径。

因此,当它们匹配时,这意味着脚本不是源。



1

另一种选择是删除执行权限。在这种情况下,它无法执行,但仍可以作为源。


1
这是不完整的。bash script无论脚本上的执行标志如何,您仍然可以运行脚本。同样在Cygwin下(此计数吗?),您不能取消执行标志。
蒂诺


0

创建一个自定义解释器source_reminder

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

不要忘记使其可执行。然后在脚本中使用它:

#!/path/to/your/source_reminder
foo
bar
whatever

现在,如果您在不购买资源的情况下运行脚本,则提醒将完成其工作。


不错的收获。 #!/bin/echo do not execute#!/bin/false#!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }。但是,这不能捕获以类似方式执行脚本的情况sh script(因为它忽略了Shebang)。
Tino
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.