采购包含 `echo ${BASH_SOURCE[0]}` 的脚本仍然显示源脚本的路径名

Tim*_*Tim 4 bash source

我有一个 bash 脚本,它输出脚本本身的路径名

$ cat f4.sh 
#! /bin/bash    
echo "${BASH_SOURCE[0]}"
Run Code Online (Sandbox Code Playgroud)

我想如果我在另一个脚本中获取脚本并运行另一个脚本,它会输出另一个脚本的路径名,因为源就像将源脚本的内容复制到源脚本中并运行源脚本。

但是我错了,还是输出原脚本的路径名

$ cat ff.sh 
#! /bin/bash
source ../f4.sh

$ bash ff.sh 
../f4.sh
Run Code Online (Sandbox Code Playgroud)

为什么?

我想知道另一个脚本是否可以通过使用 f4.sh 而不是直接使用${BASH_SOURCE[0]}? 谢谢。

Kus*_*nda 6

在这种情况下,如果您想从 获取主脚本的路径名BASH_SOURCE,则必须使用${BASH_SOURCE[1]}.

对于源的每一级,一个新元素被添加到开始所述的BASH_SOURCE阵列,以使得${BASH_SOURCE[0]}总是当前源文件和${BASH_SOURCE[1]}所述一个它从源(和${BASH_SOURCE[2]}在一个被从来源,如果它来源)。要查看主脚本,请查看${BASH_SOURCE[-1]}最后一个元素。

采购脚本并不能完全将脚本的内容复制到主脚本中。它就像运行一个普通的脚本,但它与主脚本在相同的环境中执行。它更类似于执行一个函数。