심볼릭 링크의 대상이 특정 경로를 가리키는 지 확인하는 방법


16

bash 스크립트 내에서 파일이 다음 구문의 기호 링크인지 확인할 수 있다는 것을 알고 있습니다

if [ -L $path ]

그 경로가 특정 경로에 연결되어 있는지 테스트하는 방법을 아는 사람이 있습니까? 예를 들어의 대상이 $path입니다 /some/where.



2
당신은 연결 뜻 에 의해 특정 경로? 당신은은 할 수 없습니다 readlink공지 된 경로 그것은 경로 당신이있는 거 테스트와 비교?
Bratchley

@Bratchley. 네, 그게 제 뜻입니다. 답변 주셔서 감사합니다.
BillMan

2
if [ -L "$path" ]타당한 이유가없고하고있는 일을 확실히 알지 않는 한 항상 쉘 변수를 따옴표 (예 :)로 묶어야합니다 .
G-Man, 'Reinstate

@ G-Man은 큰 피드백에 감사드립니다. 무의식적으로 나는 그것을 알고 있지만 실제로 잊어 버립니다. 강화가 도움이됩니다.
BillMan

답변:


22

$path대상이의 심볼릭 링크 인지 확인 /some/where하려면 readlink유틸리티를 사용할 수 있습니다 . POSIX는 아니지만 많은 시스템 (GNU / Linux, BusyBox, * BSD,…)에서 사용할 수 있습니다.

if [ "$(readlink -- "$path")" = /some/where ]; then 

이것은 정확한 텍스트 비교입니다. 링크의 대상이 /some//where또는이고 where$path/some/link인 경우 텍스트가 일치하지 않습니다.

많은 버전 의이 readlink옵션 을 지원합니다.이 옵션 -f은 모든 심볼릭 링크를 확장하여 경로를 표준화합니다.

dash, ksh, bash 및 zsh를 포함한 많은 쉘 -eftest내장 파일 의 연산자를 지원하여 두 파일이 같은지 테스트합니다 (심볼릭 링크를 따른 후 동일한 파일에 대한 하드 링크). 이 기능은 널리 지원되지만 POSIX에서는 지원되지 않습니다.

if [ "$path" -ef "/some/where" ]; then 

링크가 상대 경로를 가리킬 때 첫 번째 예제는 작동하지 않습니다 ...
inemanja

1
@inemanja 물론입니다. 그러나 내가 말했듯이 이것은 텍스트 비교입니다. 동일한 대상에 대한 다른 경로를 다른 것으로 취급합니다. 심볼릭 링크의 대상이 특정 경로가 아닌 특정 파일 인지 테스트 하려면 아래에서 설명하는 방법 중 하나를 사용하십시오.
Gilles 'SO- 악마 그만해

0

상대 및 절대 경로 및 경로 또는 링크 끝에 "/"가있는 문제를 피하려면 다음을 수행하십시오.

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

1
readlink필요하지 않은 것처럼 realpath자동으로 심볼릭 링크를 해결합니다.
Dagang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.