首页 > 其他分享 >如何从脚本本身内获取Bash脚本所在的目录?

如何从脚本本身内获取Bash脚本所在的目录?

时间:2023-10-08 21:11:08浏览次数:25  
标签:脚本 符号 链接 SOURCE Bash cd 目录 DIR

内容来自 DOC https://q.houxu6.top/?s=如何从脚本本身内获取Bash脚本所在的目录?

如何获取Bash脚本所在目录的路径,并在该脚本内部获取?

我想将一个Bash脚本用作另一个应用程序的启动器。我想将工作目录更改为Bash脚本所在的目录,以便我可以在该目录中的文件上进行操作,例如这样:

$ ./application


#!/usr/bin/env bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH\_SOURCE[0]}" )" &> /dev/null && pwd )

这是一个有用的一行命令,它将为您提供脚本的完整目录名称,无论从哪里调用它。

只要用于查找脚本的路径的最后一部分不是符号链接(目录链接是可以的),它就可以工作。如果您还想解析指向脚本本身的任何链接,您需要一个多行解决方案:

#!/usr/bin/env bash

SOURCE=${BASH\_SOURCE[0]}
while [ -L "$SOURCE" ]; do # 解析 $SOURCE,直到文件不再是符号链接
  DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
  SOURCE=$(readlink "$SOURCE")
  [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE # 如果 $SOURCE 是相对符号链接,我们需要将其相对于符号链接文件所在的位置进行解析
done
DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )

这个最后的示例可以处理任何组合的别名、sourcebash -c、符号链接等。

注意:如果在运行此代码片段之前先使用cd命令更改了目录,则结果可能不正确!

此外,请当心 $CDPATH陷阱,以及用户智能地将cd重定向到输出的错误输出(包括转义序列,例如在Mac上调用update_terminal_cwd >&2)时可能出现的情况。在cd命令的末尾添加>/dev/null 2>&1可以解决这两种可能性。

要了解它的工作原理,请尝试运行这个更详细的版本:

#!/usr/bin/env bash

SOURCE=${BASH\_SOURCE[0]}
while [ -L "$SOURCE" ]; do # 解析 $SOURCE,直到文件不再是符号链接
  TARGET=$(readlink "$SOURCE")
  if [[ $TARGET == /* ]]; then
    echo "SOURCE '$SOURCE' 是一个指向 '$TARGET' 的绝对符号链接"
    SOURCE=$TARGET
  else
    DIR=$( dirname "$SOURCE" )
    echo "SOURCE '$SOURCE' 是一个指向 '$TARGET' 的相对符号链接(相对于 '$DIR')"
    SOURCE=$DIR/$TARGET # 如果 $SOURCE 是相对符号链接,我们需要将其相对于符号链接文件所在的路径进行解析
  fi
done
echo "SOURCE is '$SOURCE'"
RDIR=$( dirname "$SOURCE" )
DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
if [ "$DIR" != "$RDIR" ]; then
  echo "DIR '$RDIR' 解析为 '$DIR'"
fi
echo "DIR is '$DIR'"

它会输出类似以下内容:

SOURCE './scriptdir.sh' 是一个指向 'sym2/scriptdir.sh' 的相对符号链接(相对于 '.')
SOURCE is './sym2/scriptdir.sh'
DIR './sym2' 解析为 '/home/ubuntu/dotfiles/fo fo/real/real1/real2'
DIR is '/home/ubuntu/dotfiles/fo fo/real/real1/real2'

标签:脚本,符号,链接,SOURCE,Bash,cd,目录,DIR
From: https://www.cnblogs.com/xiaomandujia/p/17750150.html

相关文章

  • 虚拟环境搭建,luffy后台项目创建、目录调整,封装logger,封装全局异常,封装Response,后台数
    1虚拟环境搭建......
  • Linux系列---【shell脚本-模拟手动跑每天的定时任务】
    问题背景上线的时候经常会遇到这样的问题,上线一个每天跑的定时任务,一般跑最近一年的数据,上线的时候需要手动跑过去最近一年的数据,手动肯定不方便,于是这里写了一个好用的shell脚本,来降本增效。shell脚本#!/bin/bash#设置循环的日期范围start_date="20230801"end_date="20......
  • 博客目录
    一、数通HCIE1. 网络工程师_入门&组网基础2.OSPF3.VLAN4.ACL5.STP6.NAT7.AAA8.PPP&PPPoE 二、安全HCIE1.网络安全概念及规范2.网络基础3.防火墙入门4. 5. 6.  三、应试1.计算机网络2.数据结构 3.高等数学4.线性代数 ......
  • Java 应用启动脚本
    启动代码java-server-Xms4g-Xmx4g-Xss256k-XX:NewSize=512m-XX:MaxNewSize=512m-XX:+UseG1GC-XX:InitiatingHeapOccupancyPercent=40-XX:G1HeapRegionSize=8m-XX:+ExplicitGCInvokesConcurrent-XX:ParallelGCThreads=4-Dsun.rmi.dgc.server.gcInterval=36000000-Ds......
  • 创建数据库全量备份脚本
    创建用户账号和密码配置文件#创建一个backup的登录路径mysql_config_editorset--login-path=backup--host=localhost--user=username--password在上述命令中,将backup替换为适合您的环境和需求的登录路径名称,localhost、username和--password替换为实际的数据库主机......
  • 完整创建数据库,shell脚本
    #1.安装依赖[root@db03~]#yuminstall-yautoconflibaio-devel#1.解压[root@db02~]#tarxfmysql-5.6.50-linux-glibc2.12-x86_64.tar.gz#2.创建app目录[root@db02~]#mkdir/app#3.移动目录[root@db02~]#mv/root/mysql-5.6.50-linux-glibc2.12-x86_64/a......
  • shell脚本执行make不一定调用Makefile
    今天在研究安卓编译流程时发现,shell脚本内执行make并不会调用当前路径下的Makefile,这有点让我大吃一惊。一番定位过后,发现执行make时调用的是另外一个shell脚本内定义的make函数,所以猜想可能GNUMake工具发现make有定义,所以直接调用该函数去了。于是我做了如下实验进行猜想验......
  • Python入门示例系列 目录
    系列目录对应的B站视频:https://www.bilibili.com/video/BV1UL411c71d 入门*Python入门示例系列01为什么学Python-Python入门示例系列02Python语言的特点Python入门示例系列03安装Python开发工具(IDE)-Python入门示例系列04使用IDLEShellPython入门示例系列05使用PyChar......
  • 编写脚本实现tomcat一键安装8.5版本
    #下载包到/root目录[root@tomcat~]#lljdk-8u212-linux-x64.tar.gzapache-tomcat-8.5.82.tar.gz-rw-r--r--1rootroot10610025Aug2717:14apache-tomcat-8.5.82.tar.gz-rw-r--r--1rootroot195013152Aug2717:08jdk-8u212-linux-x64.tar.gz#编写脚本[root@to......
  • Linux系统目录结构
    linux系统目录结构 linux的/目录linux目录:一切从/开始,/是最顶级的目录 类似Windows只有一个C盘 linux的一级目录bin:二进制命令所在的目录,这个目录存放着最经常使用的命令。dev:硬件设备所在的目录磁盘光驱,home:普通用户的家目录 root:管理员用户的家目录mn......