비기호적 링크 파일에 readlink를 적용하시겠습니까?

비기호적 링크 파일에 readlink를 적용하시겠습니까?

이 코드스택 오버플로에서스크립트가 심볼릭 링크를 통해 실행되더라도 스크립트 내부에서 스크립트의 상위 디렉터리의 경로 이름을 가져오는 것입니다.

if [ -L $0 ] ; then
    DIR=$(dirname $(readlink -f $0)) ;
else
    DIR=$(dirname $0) ;
fi ;

위의 코드는 다음과 동일합니까?

DIR=$(dirname $(readlink -f $0)) ;

즉, 심볼릭 링크인지 테스트하고 $0, 그렇다면 다른 명령을 실행해야 합니까?

심볼릭 링크를 $(dirname $(readlink -f $0))사용하거나 사용하지 않고 그냥 사용하면 안되는 이유는 무엇입니까 ?$0

특히 $0심볼릭 링크가 포함된 경우에는 를 사용하세요 $(dirname $(readlink -f $0)).

심볼릭 링크가 아닌 경우 $0다음을 사용하는 것이 완벽해 보입니다 $(dirname $(readlink -f $0)).

  • $(readlink -f $0)절대 경로를 반환 $0하고 $(dirname $(readlink -f $0))상위 디렉터리의 절대 경로를 반환합니다.$0

  • $(dirname $0) 반환된 상위 경로는 $0절대 경로인지 상대 경로인지에 따라 $0절대 경로인지 상대 경로인지에 따라 달라집니다.

  • DIR원래 코드에서는 값이 절대 경로인지 상대 경로인지는 중요하지 않다고 생각합니다 . 두 경우 모두 값은 의 DIR상위 디렉터리를 참조하기 때문입니다 $0. 원래 코드에서도 $(dirname $(readlink -f $0))와 동등 합니까 ?$(dirname $0)

감사해요.

답변1

"$0"및 를 사용해야 합니다 dirname "$()".

셸 테스트는 경로의 마지막 구성 요소에만 영향을 미치고 readlink -f모든 경로 수준에는 영향을 미치기 때문에 이러한 명령은 동일하지 않습니다.

mkdir physdir
touch physdir/file
ln -s physdir symlink
test -L symlink/file ; echo $?
    1
test -L symlink ; echo $?
    0
dirname symlink/file
    symlink
dirname "$(readlink -f symlink/file)"
    /crypto/home/hl/tmp/stackexchange/readlink/physdir

따라서 상대 경로의 경우 출력은 완전히 다르지만 절대 경로의 경우에도 그 안에 있는 심볼릭 링크 디렉터리는 다릅니다.

답변2

차이가 있는지 여부는 사용중인 유닉스의 정확한 취향에 달려 있다고 생각합니다. 예를 들어, OSX에서 readlink에는 플래그가 없으며 -f다음과 같이 선언합니다.

주어진 인수가 심볼릭 링크가 아니면 readlink는 아무것도 인쇄하지 않고 오류와 함께 종료됩니다.

운영 체제가 이 플래그를 지원한다는 것을 알고 있다면 -f아무런 차이가 없을 것입니다.

사실은-중플래그는 아마도 사용하기에 가장 유연한 플래그일 것입니다.

관련 정보