在shell脚本内部获取该脚本所在目录的绝对路径

目录

需求描述

[方法一:使用 dirname 和 readlink 命令](#方法一:使用 dirname 和 readlink 命令)

[方法二:使用 BASH_SOURCE 变量](#方法二:使用 BASH_SOURCE 变量)

[方法三:仅使用纯 Bash 实现](#方法三:仅使用纯 Bash 实现)


需求描述

工作中经常有这样情况,需要在脚本内部获取该脚本自己所在目录的绝对路径。

假如有一个脚本/a/b/c/work.sh。如何在work.sh内部获取work.sh所在目录的绝对路径,即获取到/a/b/c,或者/a/b/c/也可以。要求无论在哪个目录执行work.sh都能达到目的。

能适用于以下情形:

情形1:在/a/b/c目录下执行 bash work.sh或者bash ./work.sh 或者 bash /a/b/c/work.sh

情形2:在/a目录执行bash b/c/work.sh或者./b/c/work.sh 或者 bash /a/b/c/work.sh

情形3:在/a/b/c/d/目录下执行 bash ../work.sh 或者 bash /a/b/c/work.sh

以下是几种常见且有效的实现方式。

dirname 命令用于返回路径中的目录部分,readlink -f 用于获取文件的绝对路径。

bash 复制代码
#!/bin/bash
# 获取脚本的绝对路径
script_path=$(readlink -f "$0")
echo "$script_path"
# 获取脚本所在目录的绝对路径
script_dir=$(dirname "$script_path")
echo "$script_dir"

在上述代码中,$0 代表当前正在执行的脚本名。readlink -f "$0" 会将脚本的相对路径转换为绝对路径,然后使用 dirname 命令提取出该绝对路径中的目录部分。

方法二:使用 BASH_SOURCE 变量

BASH_SOURCE 是一个数组变量,BASH_SOURCE[0] 存储着当前执行脚本的文件名。结合 dirnamerealpath 命令可以获取脚本所在目录的绝对路径。

bash 复制代码
#!/bin/bash
# 获取脚本的绝对路径
script_path=$(realpath "${BASH_SOURCE[0]}")
echo $script_path
# 获取脚本所在目录的绝对路径
script_dir=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
echo "$script_dir"

方法三:仅使用纯 Bash 实现

如果系统不支持 readlinkrealpath 命令,也可以使用纯 Bash 代码来实现:

bash 复制代码
#!/bin/bash
# 获取脚本的相对路径
relative_dir=$(dirname "$0")
# 转换为绝对路径
pushd "$relative_dir" > /dev/null
script_dir=$(pwd)
popd > /dev/null
echo "$script_dir"

在这个实现中,dirname "$0" 先获取脚本的相对目录,然后使用 pushd 命令进入该目录,pwd 命令获取当前工作目录的绝对路径,最后使用 popd 命令返回到原来的目录。> /dev/null 用于抑制命令的输出信息。

一个等价的做法是:

bash 复制代码
script_dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)

以上三种方法都能确保无论在哪个目录下执行 work.sh 脚本,都可以准确获取到该脚本所在目录的绝对路径。

相关推荐
即将头秃的程序媛1 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin1 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧3 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天3 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º4 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。4 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert6 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风6 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子7 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka7 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器