获取 /bin/sh 中脚本的真实绝对路径

获取 /bin/sh 中脚本的真实绝对路径

我正在寻找一种方法来获取当前脚本的真正绝对路径/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
}

相关内容