아래 테스트에서 파일이 존재하지 않는다고 나타나는 이유는 무엇입니까?

아래 테스트에서 파일이 존재하지 않는다고 나타나는 이유는 무엇입니까?

반면

$ 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'`

관련 정보