如何获取当前执行的 Bash 脚本文件本身所在的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
这句话的核心作用
上面这行 Bash 代码,核心功能是获取当前执行的 Bash 脚本文件本身所在的绝对路径,并将其存储在变量 SCRIPT_DIR 中(无论你在哪个目录下执行该脚本,都能准确得到脚本自身的存放路径,不会受执行目录影响)。
逐部分拆解说明
我们将代码拆分后,能清晰理解每一段的含义和作用:
-
${BASH_SOURCE[0]}
这是 Bash 中的特殊变量,作用是获取当前正在执行的 Bash 脚本文件的路径(可能是相对路径,也可能是绝对路径,取决于脚本的调用方式)。- 补充:
BASH_SOURCE是一个数组,[0]对应数组的第一个元素,即当前脚本自身的路径;如果是脚本嵌套调用,后续元素会对应被调用的脚本路径。
- 补充:
-
dirname "${BASH_SOURCE[0]}"dirname是 Linux/Unix 系统中的内置命令,作用是去除文件路径中的文件名部分,只返回该文件所在目录的路径(简单说:提取“目录路径”,剔除“文件名”)。- 示例:如果
${BASH_SOURCE[0]}的值是./test.sh(相对路径),dirname处理后会得到./;如果是/home/user/scripts/test.sh(绝对路径),处理后会得到/home/user/scripts。
-
cd "$(dirname "${BASH_SOURCE[0]}")"$(...)是命令替换语法,作用是先执行括号内的命令,将命令的输出结果作为字符串返回。- 这部分代码的含义是:先通过
dirname提取脚本所在目录,然后通过cd命令切换到该目录下。
-
&& pwd&&是 Bash 中的逻辑与运算符,作用是只有前面的命令(这里是cd命令)执行成功(返回值为 0),才会执行后面的命令。pwd是内置命令,作用是打印当前工作目录的绝对路径。- 这部分的核心:前面
cd已经切换到脚本所在目录,此时pwd就能输出该目录的绝对路径,不受执行脚本时的当前目录影响。
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
最后,通过双引号包裹整个命令替换的结果,将其赋值给变量SCRIPT_DIR,最终SCRIPT_DIR中存储的就是当前脚本所在目录的绝对路径。
关键特性(优势)
这行代码的核心优势是 “不受脚本执行目录的影响”,这是它的重要特性:
- 示例1:假设脚本存放路径是
/home/user/scripts/run.sh,你在/home/user/目录下执行./scripts/run.sh,SCRIPT_DIR依然会得到/home/user/scripts(而非/home/user)。 - 示例2:你在
/root/目录下执行/home/user/scripts/run.sh,SCRIPT_DIR同样会准确得到/home/user/scripts。 - 对比:如果直接用
pwd获取路径,得到的是“执行脚本时的当前目录”,而非“脚本自身的存放目录”,这也是这行代码被广泛使用的原因。
典型应用场景
在 Bash 脚本开发中,这行代码几乎是“标配”,常见用途是:脚本需要引用同目录(或脚本所在目录的子目录/父目录)下的其他文件(如配置文件、依赖脚本、资源文件等)时,通过 SCRIPT_DIR 构建可靠的文件路径,避免因执行目录变化导致的“文件找不到”错误。
示例(脚本内引用同目录的配置文件):
#!/bin/bash
# 获取脚本自身所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 构建同目录下 config.conf 文件的绝对路径
CONFIG_FILE="${SCRIPT_DIR}/config.conf"
# 读取配置文件(无论在哪个目录执行脚本,都能准确找到 config.conf)
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
echo "配置文件加载成功:$CONFIG_FILE"
else
echo "配置文件不存在:$CONFIG_FILE"
exit 1
fi
总结
- 核心功能:获取当前 Bash 脚本自身所在目录的绝对路径,存入
SCRIPT_DIR; - 核心优势:不受执行脚本时的当前工作目录影响,路径获取稳定可靠;
- 核心用途:构建脚本依赖文件(配置、其他脚本等)的绝对路径,避免文件查找失败;
- 关键拆解:
${BASH_SOURCE[0]}(脚本路径)→dirname(提取目录)→cd(切换目录)→pwd(输出绝对路径)→ 命令替换+赋值(得到最终路径)。

浙公网安备 33010602011771号