当BASH_SOURCE [0]不匹配时,BASH_SOURCE [1]何时匹配$ 0?

时间:2018-08-16 00:07:28

标签: bash

我最近一直在通过阅读其他人的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

1 个答案:

答案 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")