/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
}

관련 정보