!/bin/bash

admin
是 Bash 脚本文件的起始行,即 Shebang 行,它以感叹号开头,明确指定了脚本将由 /bin/bash 解释器执行,这一行至关重要,它定义了脚本的运行环境,确保脚本能够被系统正确识别和解析,是编写 Shell 脚本的标准标识。

Linux执行路径下的脚本文件路径解析与应用实战


在 Linux 系统管理和自动化运维中,脚本文件无处不在,无论是简单的 Shell 脚本还是复杂的 Python 封装,经常会遇到需要获取当前脚本所在目录、或者需要引用同目录下其他文件的情况,如何准确获取 Linux执行路径下的脚本文件路径,是每个运维人员必须掌握的核心技能。

本文将深入探讨在 Bash 环境中,如何通过变量和命令精确捕获脚本文件路径,并解决常见的路径引用问题。

!/bin/bash

核心变量:$0 的奥秘

在 Bash 中,获取脚本自身路径最基础的方法是使用特殊变量 $0


当你运行 ./test.sh 时,$0 输出的是 ./test.sh(相对路径);当你运行 /usr/local/bin/test.sh 时,$0 输出的是 /usr/local/bin/test.sh(绝对路径)。

局限性: $0 虽然能返回路径,但它并不总是“绝对路径”,如果脚本是通过符号链接调用的,或者用户使用相对路径调用,$0 的表现形式可能不够直观,且难以直接用于判断文件是否存在。

获取绝对路径:realpath 与 readlink

为了获取一个标准的、可信赖的绝对路径,我们需要借助 realpathreadlink 命令。

使用 realpath 这是最现代、最简洁的方法(GNU coreutils 自带):

echo "脚本绝对路径: $ABS_PATH"

使用 readlink -f 在旧版本的 Linux 或某些精简环境中,realpath 可能不可用,readlink -f 是最佳替代方案,它会解析符号链接,并返回最终的物理路径:

echo "脚本绝对路径: $ABS_PATH"

获取脚本所在目录(最实用的技巧)

在实际开发中,我们通常不需要知道脚本的具体文件名,只需要知道它所在的目录,以便去加载同目录下的配置文件或依赖库。

结合 dirnamecd 命令,我们可以构建一个通用的函数:

# 获取脚本所在目录的绝对路径
# 解释:
# 1. dirname "$0" 获取脚本文件名(如 test.sh)
# 2. cd "$(dirname "$0")" 切换工作目录到脚本所在目录
# 3. pwd 输出当前目录的绝对路径
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "脚本所在目录: $SCRIPT_DIR"
# 示例:引用同目录下的配置文件
CONFIG_FILE="$SCRIPT_DIR/config.conf"
if [ -f "$CONFIG_FILE" ]; then
    echo "配置文件加载成功: $CONFIG_FILE"
else
    echo "错误:配置文件未找到"
fi

进阶:区分“执行目录”与“脚本目录”

这是一个非常容易混淆的点,在 Linux 中,$PWD(当前工作目录)代表的是你启动脚本时所在的目录,而不是脚本文件所在的目录。

场景演示: 假设目录结构如下:

/home/user/
  ├── project/
  │   └── main.sh
  └── tools/
      └── helper.sh

main.sh 中执行 ./tools/helper.sh

  • 脚本文件路径 ($0)/home/user/project/tools/helper.sh
  • **当前执行目录 ($
文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码