2009-04-01 3 views
3

"-h filename"명령을 사용하여 KornShell (ksh) 스크립트의 심볼릭 링크가 있는지 확인하려고합니다. 이것은 HP 박스에서 잘 작동합니다.파일이 LINUX OS의 링크 인 경우

Linux, AIX 및 Solaris 상자에 올바른 옵션이 무엇인지 모릅니다.

이것에 대한 통찰력이 있으십니까?

답변

5

또한 리눅스 시스템에서 -h이다, 적어도 (bash는 내 껍질입니다) :

lrwxrwxrwx 1 mule mule 37 Feb 27 09:43 mule.log -> /home/mule/runtime/mule/logs/mule.log 
[[email protected] ~]$ if [[ -h mule.log ]]; then echo "mule.log is a symlink that exists" ; fi 
mule.log is a symlink that exists 

확인 man test 당신이 당신의 주어진 enviorment 파일과 문자열을 사용하는 데 사용할 수있는 사용 가능한 연산자를 볼 수 있습니다.

1

가장 좋은 대답은 시스템에서 '테스트'맨 페이지가 말하는 모든 것을 시도하는 것입니다. 작동하는 것 같으면 더 이상 보지 마십시오. 그러나, 그것이 작동하지 않는 것처럼 보일 경우, 또는 더 모호한 테스트 옵션에 대해 질문이있는 경우 쉘의 매뉴얼 페이지에서 'expr'또는 '['가 내장되어 있는지 확인해야합니다. 이 경우 쉘은/bin에서 expr 유틸리티를 호출하는 대신 내부 구현을 사용 중일 수 있습니다. 솔라리스에서 ksh93은 [맨 페이지가 그렇게 보이지는 않지만] [builtin으로 취급합니다. 트러스 출력에서 ​​ksh가 [에 대한 expr 명령을 실행하고 있지 않음을 알 수 있습니다.

 
% truss -f -texec /bin/ksh '[ -h /home ]' 
26056: execve("/usr/bin/ksh", 0x08047708, 0x08047714) argc = 2 
26056: execve("/usr/bin/ksh93", 0x08047708, 0x08047714) argc = 2 
26056: execve("/usr/bin/amd64/ksh93", 0x08047704, 0x08047710) argc = 2 

% truss -f -texec /bin/ksh '/bin/expr -h /home ]' 
26058: execve("/usr/bin/ksh", 0x08047700, 0x0804770C) argc = 2 
26058: execve("/usr/bin/ksh93", 0x08047700, 0x0804770C) argc = 2 
26058: execve("/usr/bin/amd64/ksh93", 0x080476FC, 0x08047708) argc = 2 
26058: execve("/bin/expr", 0x00418360, 0x00418398) argc = 4 
6

-hPOSIX spec의 일부이고; 그것은 막연하게 합리적인 모든 곳에서 효과가 있어야합니다. 맥 OS X에 man test에 따르면

: 당신이 -h이 작동하지 않습니다 어디서나 찾을 그래서 만약

 
    -h file  True if file exists and is a symbolic link. This operator 
        is retained for compatibility with previous versions of 
        this program. Do not rely on its existence; use -L instead. 

-L

또한, 표준화, 대신 -L을 시도해야합니다.

0

(THW) 두 가지 옵션은 $ 만약

if [ -h filename ] 
OR 
    ls -ltr | grep filename | grep ^l 

입니까? 0이면 파일은 링크되지 않은 상태로 링크됩니다. 대신 첫 번째 옵션을 선호합니다.