現在、スクリプトの実際の絶対パスを取得する方法を探しています/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
}