获取脚本文件名用 basename "$0",获取所在目录绝对路径推荐 readlink -f "$0" 后 dirname,获取自身绝对路径直接 readlink -f "$0";若无 readlink -f,则用 (cd "$(dirname "$0")" && pwd -p) 兜底。

获取当前运行脚本的文件名和绝对路径,关键在于区分两个概念:一是脚本被调用时的原始表示(如 $0),二是它在文件系统中真实、可定位的位置。直接用 $0 不可靠,因为它可能是相对路径、符号链接名,甚至只是命令名(比如从 $PATH 中执行时)。
获取脚本文件名(不含路径)
用 basename "$0" 最稳妥:
-
basename会剥离路径部分,只保留最后的文件名 - 双引号包裹
"$0"防止含空格或特殊字符时报错 - 示例:
basename "/home/user/bin/deploy.sh"→deploy.sh
获取脚本所在目录的绝对路径
推荐用 readlink -f 解析后取目录:
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")-
readlink -f "$0"返回脚本的真实绝对路径(自动展开软链接、补全相对路径) -
dirname再从中提取上层目录 - 该方法在各种调用方式下都稳定:如
./script.sh、/opt/script.sh、sh /tmp/link.sh(link.sh 是软链接)
获取脚本自身的绝对路径(含文件名)
直接对 $0 使用 readlink -f:
SCRIPT_PATH=$(readlink -f "$0")- 返回类似
/home/user/bin/deploy.sh的完整路径 - 注意:若脚本是被
source执行(不是bash script.sh或./script.sh),则$0是 shell 名(如-bash),此方法失效
兼容性兜底方案(无 readlink -f 时)
某些精简系统(如 Alpine、BusyBox 环境)可能不支持 readlink -f,可用纯 shell 方式:
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd -P)-
cd "$(dirname "$0")"进入脚本所在目录(子 shell 中执行,不影响主脚本当前路径) -
pwd -P输出物理路径(-P 选项解析并跳过软链接) - 无需保存/恢复原路径,括号已隔离环境











