이 코드스택 오버플로에서스크립트가 심볼릭 링크를 통해 실행되더라도 스크립트 내부에서 스크립트의 상위 디렉터리의 경로 이름을 가져오는 것입니다.
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
아무런 차이가 없을 것입니다.
사실은-중플래그는 아마도 사용하기에 가장 유연한 플래그일 것입니다.