현재 스크립트의 실제 절대 경로를 얻는 방법을 찾고 있습니다 /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
}