Linux Shell脚本获取当前路径的方法

在Linux Shell脚本中,获取当前路径(即脚本执行时所在的目录或脚本文件所在的目录)是常见需求,主要有以下几种方法:

图片[1]_Linux Shell脚本获取当前路径的方法_知途无界

1. 获取当前工作目录(脚本执行时所在的目录)

使用 pwd 命令

pwd (print working directory) 命令会输出当前的工作目录,即执行脚本时所在的目录。

#!/bin/bash

# 获取当前工作目录
current_dir=$(pwd)
echo "当前工作目录是: $current_dir"

# 或者直接使用
echo "当前工作目录是: $(pwd)"

特点:​

  • 返回的是执行脚本时所在的目录,不是脚本文件所在的目录
  • 如果通过相对路径执行脚本,结果会随着执行位置的变化而变化

适用场景:​​ 当你需要知道脚本在哪里被执行时使用

2. 获取脚本文件所在的目录

方法一:使用 dirname $0pwd 组合

#!/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. 最佳实践推荐

推荐方法:使用 dirnamepwd 组合

#!/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脚本中获取当前路径的关键要点:

  1. ​**pwd**​:获取脚本执行时的当前工作目录(执行位置)
  2. ​**$0**​:获取脚本文件名(可能是相对或绝对路径)
  3. ​**dirname $0**​:获取脚本所在目录的相对路径
  4. ​**cd "$(dirname "$0")" && pwd**​:获取脚本所在目录的绝对路径(推荐方法)
  5. ​**${BASH_SOURCE[0]}**​:更可靠的获取脚本路径方式(尤其在函数或source时)
  6. ​**readlink -f**​:解析符号链接获取真实路径

最佳实践推荐:​

  • 对于大多数情况,使用 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) 获取脚本所在绝对目录
  • 如果需要处理符号链接,使用 readlink -f 或更复杂的追踪方法
  • 在复杂的脚本环境中(如可能被source执行),使用 ${BASH_SOURCE[0]} 更可靠

通过正确获取脚本所在路径,可以确保脚本中引用的其他文件(如配置文件、辅助脚本等)能够被正确定位,使脚本更具可移植性和可靠性。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞28 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容