我最近一直在通过阅读其他人的Bash来研究Bash,在BASH3 Boilerplate中,我找到了这段代码来确定脚本是否作为主要脚本运行:
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
__i_am_main_script="0" # false
if [[ "${__usage+x}" ]]; then
if [[ "${BASH_SOURCE[1]}" = "${0}" ]]; then
__i_am_main_script="1" # true
fi
__b3bp_external_usage="true"
__b3bp_tmp_source_idx=1
fi
else
__i_am_main_script="1" # true
[[ "${__usage+x}" ]] && unset -v __usage
[[ "${__helptext+x}" ]] && unset -v __helptext
fi
我不确定__usage
有多重要,除了它在脚本中以后已定义。
在测试中,我无法找到$BASH_SOURCE[1]
与$0
相同但$BASH_SOURCE[0]
不同的情况。实际情况是什么导致这一事实成立?
我确实知道$0
可以是unreliable,但我假设这种模式必须足够频繁才能不仅仅是将其留在:
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
__i_am_main_script="0" # false
else
__i_am_main_script="1" # true
...
fi
答案 0 :(得分:1)
这种情况发生在脚本来源:
$ cat foo
source bar
$ cat bar
echo "\$0 is $0, and here's BASH_SOURCE:"
declare -p BASH_SOURCE
$ bash foo
$0 is foo, and here's BASH_SOURCE:
declare -a BASH_SOURCE=([0]="bar" [1]="foo")