OSX에서 test -h 또는 test -L을 사용하는 방법은 무엇입니까?


3

파일이 디렉토리를 가리키는 심볼릭 링크인지 쉘 스크립트에서 감지하려고합니다. 이것이 내가하고있는 일입니다.

if [[ -L "$out_dir" && -d "$out_dir" ]]
then
    echo "Dir is a symlink"
else
    echo "Dir is not a symlink"
fi

그러나 이것은 실패합니다. 몇 가지 실험 :

bash-3.2 $ ls -ail ..
총 16
8004466 drwxr-xr-x 10 사용자 이름 1177235957340 Jul 18 15:41 ./
1020189 drwxr-xr-x 10 사용자 이름 1177235957340 Jul 18 15:16 ../
8004467 drwxr-xr-x 12 사용자 이름 1177235957408 Jul 18 15:16 .git /
8004528 -rw-r--r-- 1 사용자 이름 1177235957 501 Jul 18 15:16 .gitignore
8004919 lrwxr-xr-x 1 사용자 이름 1177235957 22 Jul 18 15:41 종속성-> ../../lmi/Dependencies

그래서 ../Dependencies, LS에 따르면, 심볼릭 링크는 그러나,이다 :

bash-3.2 $ test -L ../ 종속성
bash-3.2 $ echo $?
0
bash-3.2 $ test -h ../ 종속성
bash-3.2 $ echo $?
0

둘 다 1을 반환하면 안됩니까? 이것이 어떻게 작동 해야하는지에 대해 오해하고 있습니까? 파일이 디렉토리를 가리키는 심볼릭 링크인지 감지하는 목표를 어떻게 달성 할 수 있습니까?

답변:


3

실험의 이탈 값이 정확합니다. 하면 test유틸리티가 식을 계산 표현식이 true로 평가되면, test반환 제로 (참) 종료 상태를; 그렇지 않으면 1 (false)을 반환합니다 .

따라서 예제에서 기호 링크 test -L ../Dependencies이기 때문에 0 (true)을 리턴합니다 ../Dependencies. 심볼릭 링크 ../Dependencies 가 아닌 경우 test1 (거짓)을 반환합니다.

쉘 스크립트 if명령문은 정확하지만 echo쉘 스크립트가 실행될 때 다른 문제점이 있는지 확인하는 명령을 추가 할 수 있습니다 . 예를 들어, 명령문 echo앞에 두 개의 명령을 추가 할 수 있습니다 if.

echo "path is '$PWD'"
echo "out_dir is '$out_dir'"

나는 그것을 시도했고 둘 다 맞다. 또한 링크에서 readlink를 사용할 수 있으며 올바른 정보를 표시합니다. 즉, 문제가 다른 곳에 있다고 말하는 것이 옳을 수도 있으므로 질문에 대한 대답입니다.
Tamás Szelei

2

나는 더 복잡한 해결책으로 갈 것입니다 (나의 성격에 맞지 만 지금은 중요하지 않습니다 ...)

for x in $(ls -lp|egrep ^[dl].*\/$); do 
   case $(echo $x|cut -c 1) in 
      "d") echo "This is a dir";; 
      "l") echo "This is a link";;
   esac
done

간단히 말해서 ls -lp모든 디렉토리에 슬래시가있는 긴 형식을 인쇄합니다. 긴 형식의 첫 문자는 모드 ( d디렉토리, l링크, -일반 파일 등)를 나타냅니다. 이 정보 감안할 때, 우리가 사용할 수있는 egrep우리를 필터링하는 lsA의 최종 디렉토리와 링크의 명부 /및 사용 case더 우리의 목록을 필터링 할 수 있습니다. 참고 :이 루프는 -p옵션으로 인해 링크 된 파일을 필터링합니다 .ls


1

나는 다음 해결책으로 끝났다.

function is_sym_link()
{
    readlink $1 > /dev/null
    return $?
}

모든 경우를 다루지는 않지만 내 환경에서는 충분합니다. 불행히도 원본이 왜 작동하지 않았는지 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.