我正在寻找一种方法来获取当前脚本的真正绝对路径/bin/sh
。它应该适用于这样的情况:
/path/to/symlink/in/PATH/somescript
-> ../../Package/current/bin/somescript.sh
...where../../Package/current
本身就是一个指向 的符号链接v1.23
。
重要假设:我们假设readlink
可以使用,但不一定有这个-f
选项。
由于感兴趣的代码包含在脚本文件中,因此该代码可以安全地假设所有符号链接都是合法的,并最终指向正确的位置(否则 shell 不会找到代码并首先执行) 。 IOW,无需担心符号链接循环、损坏的符号链接等。
下面我给出了我的最佳尝试,但我觉得有点矫枉过正。有没有更简单的方法?
这是我的版本:
path_to_script () {
TARGET="$1"
BASENAME="$(basename "$TARGET")"
(
cd -P "$(dirname "$TARGET")"
if [ -h "$BASENAME" ]
then
path_to_script "$(readlink "$BASENAME")"
else
echo "$PWD/$BASENAME"
fi
)
}
PATH_TO_SCRIPT="$(path_to_script "$0")"
基本上,它递归地遵循符号链接,用于cd -P
解析路径中的符号链接。
答案1
我认为这不仅更短而且更容易阅读; YMMV。
path_to_script () {
if ! [ -L "$1" ]; then
echo "$1"
else
path_to_script "$(readlink "$1")"
fi
}