在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 脚本,都可以准确获取到该脚本所在目录的绝对路径。

相关推荐
开开心心就好3 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
予枫的编程笔记3 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun3 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__3 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
陈桴浮海4 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
生活很暖很治愈4 小时前
Linux——环境变量PATH
linux·ubuntu
?re?ta?rd?ed?4 小时前
linux中的调度策略
linux·运维·服务器
深圳市九鼎创展科技4 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
hweiyu004 小时前
Linux 命令:tr
linux·运维·服务器
Trouvaille ~4 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议