获取运行的脚本自身所在的路径,所面临的最核心的问题就是怎么追踪软链接
尽管Linux的coreutils中的readlink已经提供了完美答案,但并不是所有类UNIX系统中的readlink都来自coreutils,
更加通用的办法在stackoverflow上也提供了多如牛毛的答案,
但是我觉得其中不少答案或多或少存在一些问题,有的不能追踪多级软链接,有的实现太长不方便简单快捷的放在脚本里,有的无法应对一些特殊的路径情况。
于是我也想出了一个稳健的(自认为)的实现方法:
#!/bin/bash
shopt -s extglob
selfpath=$0
selfdir=${selfpath%%+([!/])}
while [[ -L "$selfpath" ]];do
selfpath=$(readlink "$selfpath")
if [[ ! "$selfpath" =~ ^/ ]];then
selfpath=${selfdir}${selfpath}
fi
selfdir=${selfpath%%+([!/])}
done
利用extglob解决原的变量替换方法会在一些特殊情况下不能正常处理,不用cd式的处理方法,想要实现方法简短,readlink基本是避免不了,但是不用选项,使之完全通用。
这个我也贴在stackoverflow上了