如何获取当前执行的 Bash 脚本文件本身所在的绝对路径

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

这句话的核心作用

上面这行 Bash 代码,核心功能是获取当前执行的 Bash 脚本文件本身所在的绝对路径,并将其存储在变量 SCRIPT_DIR(无论你在哪个目录下执行该脚本,都能准确得到脚本自身的存放路径,不会受执行目录影响)。

逐部分拆解说明

我们将代码拆分后,能清晰理解每一段的含义和作用:

  1. ${BASH_SOURCE[0]}
    这是 Bash 中的特殊变量,作用是获取当前正在执行的 Bash 脚本文件的路径(可能是相对路径,也可能是绝对路径,取决于脚本的调用方式)

    • 补充:BASH_SOURCE 是一个数组,[0] 对应数组的第一个元素,即当前脚本自身的路径;如果是脚本嵌套调用,后续元素会对应被调用的脚本路径。
  2. dirname "${BASH_SOURCE[0]}"

    • dirname 是 Linux/Unix 系统中的内置命令,作用是去除文件路径中的文件名部分,只返回该文件所在目录的路径(简单说:提取“目录路径”,剔除“文件名”)。
    • 示例:如果 ${BASH_SOURCE[0]} 的值是 ./test.sh(相对路径),dirname 处理后会得到 ./;如果是 /home/user/scripts/test.sh(绝对路径),处理后会得到 /home/user/scripts
  3. cd "$(dirname "${BASH_SOURCE[0]}")"

    • $(...) 是命令替换语法,作用是先执行括号内的命令,将命令的输出结果作为字符串返回
    • 这部分代码的含义是:先通过 dirname 提取脚本所在目录,然后通过 cd 命令切换到该目录下。
  4. && pwd

    • && 是 Bash 中的逻辑与运算符,作用是只有前面的命令(这里是 cd 命令)执行成功(返回值为 0),才会执行后面的命令
    • pwd 是内置命令,作用是打印当前工作目录的绝对路径
    • 这部分的核心:前面 cd 已经切换到脚本所在目录,此时 pwd 就能输出该目录的绝对路径,不受执行脚本时的当前目录影响。
  5. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    最后,通过双引号包裹整个命令替换的结果,将其赋值给变量 SCRIPT_DIR,最终 SCRIPT_DIR 中存储的就是当前脚本所在目录的绝对路径。

关键特性(优势)

这行代码的核心优势是 “不受脚本执行目录的影响”,这是它的重要特性:

  • 示例1:假设脚本存放路径是 /home/user/scripts/run.sh,你在 /home/user/ 目录下执行 ./scripts/run.shSCRIPT_DIR 依然会得到 /home/user/scripts(而非 /home/user)。
  • 示例2:你在 /root/ 目录下执行 /home/user/scripts/run.shSCRIPT_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

总结

  1. 核心功能:获取当前 Bash 脚本自身所在目录的绝对路径,存入 SCRIPT_DIR
  2. 核心优势:不受执行脚本时的当前工作目录影响,路径获取稳定可靠;
  3. 核心用途:构建脚本依赖文件(配置、其他脚本等)的绝对路径,避免文件查找失败;
  4. 关键拆解:${BASH_SOURCE[0]}(脚本路径)→ dirname(提取目录)→ cd(切换目录)→ pwd(输出绝对路径)→ 命令替换+赋值(得到最终路径)。
posted @ 2026-01-04 10:30  icuic  阅读(21)  评论(0)    收藏  举报