【shell-11】获取当前执行脚本的路径

本文介绍了如何在Linux中使用`ls-ld`和`pwd-P`命令以及bash脚本来获取软连接的真正目标路径,通过递归方式处理深度嵌套的软链接,避免循环检测的限制。
摘要由CSDN通过智能技术生成

摘要

本代码在框架开发比较有用,比如别人安装了你开发的东西,你的启动脚本都在自己的某个 bin目录下,但是使用者可能
ln -s /…/…/bin/start_demo.sh /home/张三/start.sh 建立了一个软连接,因此有时候我们可能需要获取真实bin路径。

ls -ld - - “目录或文件”

  1. ls: 这是一个列出目录内容的命令。
  2. -l: 这是ls命令的一个选项,用于以长格式显示文件和目录的详细信息。包括文件的权限、所有者、组、大小、最后修改时间和文件名。
  3. -d: 这个选项告诉ls只列出目录本身的信息,而不是列出目录中子目录。这对于目录来说特别有用,因为它允许你查看目录的属性, 而不是目录中包含的文件和子目录。
  4. - -: 这是一个特殊的参数,用于分隔命令的选项和参数。这在处理可能以 - 开头的文件名或目录名时特别有用,因为它可以确保shell不会错误地将这些名称解释为参数。
  5. “目录”: 这是一个变量,它应该包含你想要查询的目录或文件的路径。通过使用双引号,你可以确保即使路径中包含空格或特殊字符,它们也会被正确地当作一个整体来处理。
    综合来看,ls -ld – **“目录或文件”**命令 会返回关于 “目录或文件”(一个目录或文件)属性信息,而不会列出目录中的内容(如果$target是一个目录的话)。这个命令通常用于脚本中,以便程序化地获取文件或目录的属性信息。

pw 和pw -P

pwd -P 可自动解析软连接,输出结果将会是真实的物理路径

cd /home/shell
mkdir aa
# 建立bb指向aa的软连接
ln -s /home/shell/aa ./bb
cd bb

在bb目录执行 pwd:
则输出: /home/shell/bb

在bb目录执行pwd -P:
则输出: /home/shell/aa

最终代码

下面代码作用:递归100此找到真实物理路径,如果是软连接则继续递归,不是的话则退出玄幻


target="$0"
iteration=0
while [ -L "$target" ]; do # -L 判断当前脚本文件是不是软连接
    if [ "$iteration" -gt 100 ]; then
        echo "Cannot resolve path: You have a cyclic symlink in $target."
        break
    fi
    ls=`ls -ld -- "$target"` # /home/shell/pgsoft -> /home/shell/pg
    target=`expr "$ls" : '.* -> \(.*\)$'` #找到/home/shell/pg
    iteration=$((iteration + 1))
done
soft_bin=`dirname "$target"` #不会替换软连接路径名
real_bin=`cd "$bin"; pwd -P` # 会替换软连接路径名

假设在home有aa ,bb,cc:
aa是真实目录
cc和bb都是软连接
cc->bb
bb->aa

咋target为cc的时候,最后的输出结果是:
soft_bin=/home/shell/bb
real_bin=/home/shell/aa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先森

鼓励一个吧,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值