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

目录

需求描述

方法一:使用 dirname 和 readlink 命令

方法二:使用 BASH_SOURCE 变量

方法三:仅使用纯 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 命令

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

#!/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] 存储着当前执行脚本的文件名。结合 dirname 和 realpath 命令可以获取脚本所在目录的绝对路径。

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

方法三:仅使用纯 Bash 实现

如果系统不支持 readlink 或 realpath 命令,也可以使用纯 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 用于抑制命令的输出信息。

一个等价的做法是:

script_dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常考计算机操作系统面试习题(一下)

目录 操作系统基本类型 操作系统的功能 操作系统的主要任务 进程与线程 进程状态转变 内存管理 文件系统与文件管理 虚拟存储器 设备管理 磁盘调度 死锁 信号量机制 文件打开与管理 进程与线程的互斥与同步 进程同步 进程调度 文件分配磁盘块的方法 程序执行…

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS!这款由花儿不哭大佬精心打造的语音克隆神…

JVM(基础篇)

一.初识JVM 1.什么是JVM JVM全称Java Virtyal Machine,中文译名 Java虚拟机 。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件(将字节码解释成机器码)。 2.JVM的功能 解释和运行:对字节码文件中的指令号,实时…

【高并发内存池】第四弹---深入理解PageCache:整体设计、核心实现及Span获取策略详解

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】【项目详解】 目录 1、pagecache 1.1、整体设计 1.2、核心实现 1.3、获取Span 1.3.1、获取一个非空的Span 1.3…

深入理解C语言数据结构之快速排序三路划分

在数据结构和算法的世界里,排序算法是基石一般的存在。快速排序作为一种高效的排序算法,以其平均情况下的优秀时间复杂度而被广泛应用。今天,让我们深入探讨快速排序的一种变体——三路划分的快速排序,看看它是如何在C语言中施展魔…

Java实现后量子密码(PQC)与国密算法(SM4)混合加密

以下是使用Java实现一种后量子密码(PQC)与国密算法(SM4)混合加密的示例方案。该方案结合了后量子密码的抗量子特性与国密算法的国产化合规要求,适合需要双重安全保障的场景。 一 . 方案验证 1.代码截图 2.运行测试 二 . 方案设计 密钥交换:使用后量子密码(如Kyber)生…

【SQL Server数据库备份详细教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

SpringBoot古典舞在线交流平台设计与实现

随着古典舞文化的普及,越来越多的人希望通过线上平台交流学习。幽络源作为一站式综合平台,致力于为用户提供免费源码、技术教程及网络兼职资源。本文将详细介绍基于SpringBoot的古典舞在线交流平台的设计与实现,帮助开发者快速搭建一个功能完…

关于绝对时间、人类时间、本地时间、时区时间的对比分析,结合编程场景(如Java)进行说明

以下是关于绝对时间、人类时间、本地时间、时区时间的对比分析,结合编程场景(如Java)进行说明: 1. 定义与核心区别 (1) 绝对时间(Absolute Time) 定义:不受时区影响,以固定时间起点…

go语言中的strings库

strings库 func EqualFold func EqualFold(s, t string) bool判断两个utf-8编码字符串(将unicode大写、小写、标题三种格式字符视为相同)是否相同。 func main() {fmt.Println(strings.EqualFold("hello", "hello")) //truefmt.…

Git冲突解决

目录 一、Git冲突产生的原因二、解决Git冲突的步骤1. 发现冲突2. 查看冲突文件3. 手动解决冲突4. 提交解决后的代码5. 完成合并 三、预防Git冲突的小技巧四、总结 在团队协作开发中,Git冲突是常见的问题。当多个开发者同时修改了同一个文件的不同部分,然…

Spring AOP + RocketMQ 实现企业级操作日志异步采集(实战全流程)

Spring AOP + RocketMQ 实现企业级操作日志异步采集(实战全流程) 📌 项目背景 在企业级微服务架构中,记录操作日志是一项刚需。传统方式常使用数据库直接写入或通过 Feign 调用日志微服务,但这样存在耦合高、主流程阻塞、扩展性差等问题。 为此,我们将使用: Spring …

Git Flow 分支管理策略

优势 清晰的分支结构:每个分支都有明确的用途,便于团队协作。 稳定的 master 分支:生产环境代码始终稳定。 灵活的发布管理:通过发布分支和热修复分支,可以灵活管理版本发布和紧急修复。 主要分支 master 分支 代表…

Altium Designer数模电学习笔记

模电 电容 **退耦:**利用通交阻直,将看似直流的信号中的交流成分滤除 (一般用在给MPU供电,尽量小一些,10nf~100nf~1uf以下) **滤波:**也可以理解为给电容充电,让电容在电平为低时…

光谱仪与光谱相机的核心区别与协同应用

一、核心功能与数据维度 ‌光谱仪‌ ‌功能定位‌:专注单点或线状区域的光谱分析,通过色散元件(光栅/棱镜)分离波长,生成一维或二维光谱曲线,用于量化光强、吸收率等参数‌。 ‌数据维度‌:输…

Pytorch中layernorm实现详解

平时我们在编写神经网络时,经常会用到layernorm这个函数来加快网络的收敛速度。那layernorm到底在哪个维度上进行归一化的呢? 一、问题描述 首先借用知乎上的一张图,原文写的也非常好,大家有空可以去阅读一下,链接放…

linux--时区查看和修改

查看当前时间和时区: 打开终端&#xff0c;输入以下命令查看当前的日期和时间设置&#xff1a; timedatectl修改时区: 使用 timedatectl 命令来修改时区&#xff1a; sudo timedatectl set-timezone <时区>例如&#xff0c;设置时区为北京时间&#xff08;中国标准时间&a…

在windows下安装windows+Ubuntu16.04双系统(上)

这篇文章的内容主要来源于这篇文章&#xff0c;给文章很详细的介绍了如何从windows下安装windowsubuntu16.04双系统。我刚开始装双系统都是参照这个方法&#xff0c;该作者前后更新了两个版本&#xff0c;在这里对其稍微进行整理一下。 一、准备&#xff1a;&#xff08;这里推…

如何获取thinkphp的所有发行版本

是的&#xff0c;你只需要一行代码 composer show topthink/think --all 然后做了一个小实验&#xff0c;神奇的事情发生了。是我眼睛花了吗&#xff1f; 命令也能模糊查询了吗&#xff1f;tp6也太。。。。

算法模型从入门到起飞系列——递归(探索自我重复的奇妙之旅)

文章目录 前言一、递归本质1.1 递归的要素1.2 递归特点 二、递归&迭代2.1 递归&迭代比较2.2 递归&迭代如何实现相同功能2.2.1 递归实现2.2.2 迭代实现2.2.3 性能对比 三、优雅的递归理解3.1 阶乘计算分解3.2 [DFS](https://blog.csdn.net/qq_38315952/article/deta…