Quando test.sh chama source , o bash está explicitamente obtendo common.sh no script atual e, portanto, atualiza a variável BASH_SOURCE . Quando test2.sh executa a substituição de comando (que pode ser qualquer coisa) e subsequente eval , não há sourcing explícito acontecendo, então BASH_SOURCE não é afetado.
Instrua seus scripts de shell com
declare -p BASH_SOURCE linhas para ver a diferença:
$ ./test.sh
declare -a BASH_SOURCE='([0]="common.sh" [1]="./test.sh")'
declare -a BASH_SOURCE='([0]="./test.sh")'
me: common.sh
vs:
$ ./test2.sh
declare -a BASH_SOURCE='([0]="./test2.sh")'
declare -a BASH_SOURCE='([0]="./test2.sh")'
me: test2.sh
Em test2.sh , para todo o bash sabe, você executou um comando arbitrário, por exemplo, $(echo ls) .