在Linux Shell脚本中,获取当前路径(即脚本执行时所在的目录或脚本文件所在的目录)是常见需求,主要有以下几种方法:
![图片[1]_Linux Shell脚本获取当前路径的方法_知途无界](https://zhituwujie.com/wp-content/uploads/2025/11/d2b5ca33bd20251116100725.png)
1. 获取当前工作目录(脚本执行时所在的目录)
使用 pwd 命令
pwd (print working directory) 命令会输出当前的工作目录,即执行脚本时所在的目录。
#!/bin/bash
# 获取当前工作目录
current_dir=$(pwd)
echo "当前工作目录是: $current_dir"
# 或者直接使用
echo "当前工作目录是: $(pwd)"
特点:
- 返回的是执行脚本时所在的目录,不是脚本文件所在的目录
- 如果通过相对路径执行脚本,结果会随着执行位置的变化而变化
适用场景: 当你需要知道脚本在哪里被执行时使用
2. 获取脚本文件所在的目录
方法一:使用 dirname $0 和 pwd 组合
#!/bin/bash
# 获取脚本所在的绝对路径目录
script_dir=$(cd "$(dirname "$0")" && pwd)
echo "脚本所在目录是: $script_dir"
解释:
$0表示脚本文件名(可能是相对路径或绝对路径)dirname "$0"获取脚本文件所在的相对路径cd "$(dirname "$0")" && pwd先切换到脚本所在目录,然后输出绝对路径
方法二:更简洁的写法
#!/bin/bash
# 获取脚本所在目录的绝对路径
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
echo "脚本所在目录是: $SCRIPT_DIR"
特点:
${BASH_SOURCE[0]}比$0更可靠,特别是在脚本被source时&>/dev/null将标准输出和错误输出重定向到 /dev/null(静默执行)pwd -P获取物理路径(解析符号链接)
方法三:兼容性更好的写法
#!/bin/bash
# 兼容性更好的获取脚本目录方法
if [ -L "$0" ]; then
# 如果是符号链接
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
else
# 如果不是符号链接
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
fi
echo "脚本所在目录是: $SCRIPT_DIR"
适用场景: 当你需要基于脚本文件位置来访问其他文件时使用
3. 获取脚本文件的绝对路径(不只是目录)
获取脚本完整路径
#!/bin/bash
# 获取脚本的绝对路径
SCRIPT_PATH=$(readlink -f "$0")
echo "脚本完整路径是: $SCRIPT_PATH"
# 或者
SCRIPT_PATH=$(cd "$(dirname "$0")" && pwd)/$(basename "$0")
echo "脚本完整路径是: $SCRIPT_PATH"
获取脚本文件名
#!/bin/bash
# 获取脚本文件名
SCRIPT_NAME=$(basename "$0")
echo "脚本文件名是: $SCRIPT_NAME"
4. 各种方法的对比与选择
| 方法 | 获取内容 | 是否绝对路径 | 是否解析符号链接 | 适用场景 | 备注 |
|---|---|---|---|---|---|
pwd | 当前工作目录 | 是 | 否 | 获取脚本执行位置 | 执行位置可能变化 |
dirname $0 | 脚本相对路径 | 否 | 否 | 基础方法 | 可能返回相对路径 |
cd "$(dirname "$0")" && pwd | 脚本所在绝对目录 | 是 | 否 | 常用方法 | 推荐使用 |
dirname "$(readlink -f "$0")" | 脚本所在绝对目录 | 是 | 是 | 解析符号链接 | 最可靠方法 |
${BASH_SOURCE[0]} | 脚本路径(更可靠) | 需配合其他命令 | 需配合其他命令 | 函数或source时 | Bash特有 |
5. 最佳实践推荐
推荐方法:使用 dirname 和 pwd 组合
#!/bin/bash
# 获取脚本所在目录的绝对路径(推荐)
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "脚本所在目录: $SCRIPT_DIR"
# 使用示例:访问脚本同目录下的其他文件
CONFIG_FILE="$SCRIPT_DIR/config.conf"
echo "配置文件路径: $CONFIG_FILE"
更健壮的推荐方法(处理符号链接)
#!/bin/bash
# 获取脚本所在目录的绝对路径(处理符号链接)
SCRIPT_DIR=$(cd "$(dirname "$(readlink -f "$0")")" &>/dev/null && pwd)
echo "脚本所在目录: $SCRIPT_DIR"
兼容性极强的方法(适用于各种情况)
#!/bin/bash
# 获取脚本所在目录(兼容性极强)
get_script_dir() {
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # 如果是符号链接
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # 如果是相对链接
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
echo "$DIR"
}
SCRIPT_DIR=$(get_script_dir)
echo "脚本所在目录: $SCRIPT_DIR"
6. 实际应用示例
示例1:在脚本所在目录创建日志文件
#!/bin/bash
# 获取脚本所在目录
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# 在脚本目录下创建日志文件
LOG_FILE="$SCRIPT_DIR/app.log"
echo "日志记录在: $LOG_FILE"
echo "$(date): 脚本启动" >> "$LOG_FILE"
示例2:加载脚本同目录下的配置文件
#!/bin/bash
# 获取脚本所在目录
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# 加载配置文件
CONFIG_FILE="$SCRIPT_DIR/config.sh"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
echo "配置文件加载成功: $CONFIG_FILE"
else
echo "配置文件不存在: $CONFIG_FILE"
exit 1
fi
示例3:在脚本目录中执行其他脚本
#!/bin/bash
# 获取脚本所在目录
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# 执行同一目录下的其他脚本
OTHER_SCRIPT="$SCRIPT_DIR/helper.sh"
if [ -f "$OTHER_SCRIPT" ]; then
bash "$OTHER_SCRIPT"
else
echo "辅助脚本不存在: $OTHER_SCRIPT"
fi
7. 特殊情况处理
当脚本被source时(如 . script.sh 或 source script.sh)
#!/bin/bash
# 检查脚本是否被source执行
if [ "${BASH_SOURCE[0]}" != "${0}" ]; then
echo "脚本被source执行"
# 在这种情况下,$0 可能是父shell的名称
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
else
echo "脚本直接执行"
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
fi
echo "脚本目录: $SCRIPT_DIR"
处理符号链接的脚本
#!/bin/bash
# 获取真实脚本路径(即使是符号链接)
get_real_script_path() {
local SCRIPT_PATH
SCRIPT_PATH="$0"
# 如果是符号链接,追踪到真实文件
while [ -L "$SCRIPT_PATH" ]; do
SCRIPT_PATH=$(readlink "$SCRIPT_PATH")
# 如果是相对链接,需要结合当前路径
[[ $SCRIPT_PATH != /* ]] && SCRIPT_PATH=$(dirname "$0")/"$SCRIPT_PATH"
done
echo "$SCRIPT_PATH"
}
REAL_SCRIPT_PATH=$(get_real_script_path)
SCRIPT_DIR=$(cd "$(dirname "$REAL_SCRIPT_PATH")" && pwd)
echo "真实脚本目录: $SCRIPT_DIR"
总结
在Shell脚本中获取当前路径的关键要点:
- **
pwd**:获取脚本执行时的当前工作目录(执行位置) - **
$0**:获取脚本文件名(可能是相对或绝对路径) - **
dirname $0**:获取脚本所在目录的相对路径 - **
cd "$(dirname "$0")" && pwd**:获取脚本所在目录的绝对路径(推荐方法) - **
${BASH_SOURCE[0]}**:更可靠的获取脚本路径方式(尤其在函数或source时) - **
readlink -f**:解析符号链接获取真实路径
最佳实践推荐:
- 对于大多数情况,使用
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)获取脚本所在绝对目录 - 如果需要处理符号链接,使用
readlink -f或更复杂的追踪方法 - 在复杂的脚本环境中(如可能被source执行),使用
${BASH_SOURCE[0]}更可靠
通过正确获取脚本所在路径,可以确保脚本中引用的其他文件(如配置文件、辅助脚本等)能够被正确定位,使脚本更具可移植性和可靠性。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容