摘要
本代码在框架开发比较有用,比如别人安装了你开发的东西,你的启动脚本都在自己的某个 bin目录下,但是使用者可能
ln -s /…/…/bin/start_demo.sh /home/张三/start.sh 建立了一个软连接,因此有时候我们可能需要获取真实bin路径。
ls -ld - - “目录或文件”
- ls: 这是一个列出目录内容的命令。
- -l: 这是ls命令的一个选项,用于以长格式显示文件和目录的详细信息。包括文件的权限、所有者、组、大小、最后修改时间和文件名。
- -d: 这个选项告诉ls只列出目录本身的信息,而不是列出目录中子目录。这对于目录来说特别有用,因为它允许你查看目录的属性, 而不是目录中包含的文件和子目录。
- - -: 这是一个特殊的参数,用于分隔命令的选项和参数。这在处理可能以 - 开头的文件名或目录名时特别有用,因为它可以确保shell不会错误地将这些名称解释为参数。
- “目录”: 这是一个变量,它应该包含你想要查询的目录或文件的路径。通过使用双引号,你可以确保即使路径中包含空格或特殊字符,它们也会被正确地当作一个整体来处理。
综合来看,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