반면
$ PSEXE="$(whereis ps)"
$ echo $PSEXE
ps: /nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps
$ file /nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps
/nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps: symbolic link to /nix/store/1mhhpcb9dxyila8jqa3x1cqj9nd3l4sg-procps-3.3.16/bin/ps
아래 테스트에서 파일이 존재하지 않는다고 나타나는 이유는 무엇입니까?
$ if [ ! -x "$PSEXE" ]
> then
> echo yes
> fi
yes
감사해요.
답변1
스크립트를 분해해 보겠습니다.
PSEXE="$(whereis ps)"
echo "$PSEXE"
내 시스템에서 이는 귀하의 시스템과 매우 유사한 형태를 반환합니다. 계속할 수 있습니다.
ps: /bin/ps
특히 변수에 $PSEXE
문자열이 포함되어 있다는 점에 유의하세요 ps: /bin/ps
.
그런 다음 조건식을 사용하여 스크립트를 얻을 수 있습니다.
if [ ! -x "$PSEXE" ]
쉘은 이를 다음과 같이 효과적으로 평가합니다.
if [ ! -x 'ps: /bin/ps' ]
파일이 없으므로 ps: /bin/ps
실행 가능한 테스트가 실패하고 부정이 적용되며 결과 표현식은 로 평가됩니다 true
.
실행 파일이 에 존재하는지 확인하려면 다음을 $PATH
사용할 수 있습니다 type
.
PSEXE='ps'
if type "$PSEXE" >/dev/null 2>&1
then
echo "Executable exists"
fi
bash
대상 실행 파일을 쉽게 추출할 수 있습니다 .
PSEXE=`type -p ps 2>/dev/null`
그러나 POSIX의 경우 sh
상황은 좀 더 복잡합니다.
PSEXE=`type ps 2>/dev/null | sed -n 's/^[^ ]* is //p'`