/bin/sh からスクリプトの実際の絶対パスを取得します。

/bin/sh からスクリプトの実際の絶対パスを取得します。

現在、スクリプトの実際の絶対パスを取得する方法を探しています/bin/sh。次のような状況で動作します。

/path/to/symlink/in/PATH/somescript

    -> ../../Package/current/bin/somescript.sh

...ここで../../Package/currentそれ自体はを指すシンボリックリンクですv1.23

重要な仮定:readlink私たちはこれが可能であると仮定しますが、この-fオプションは必ずしも可能ではないかもしれません。

興味のあるコードがスクリプトファイルに含まれているため、コードはすべてのシンボリックリンクが正当で最終的に正しい場所を指していると安全に想定できます(そうしないと、シェルは最初にコードを見つけて実行できません)。 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

私はこれが短いだけでなく読みやすいと思います。

path_to_script () {
    if ! [ -L "$1" ]; then
        echo "$1"
    else
        path_to_script "$(readlink "$1")"
    fi
}

おすすめ記事