zsh 스크립트에서 인식할 수 없는 수정자 P

zsh 스크립트에서 인식할 수 없는 수정자 P

이 zsh 스크립트를 실행 중인데 다음 오류 메시지가 나타납니다.

./executable: unrecognized modifier `P'

스크립트의 코드는 다음과 같습니다.

#!/bin/zsh

setopt no_unset err_exit pipe_fail

if [[ $# -lt 2 ]]; then
    cat <<EOF
Usage: ${0:t} something1 something2 ..
EOF
    exit 1
fi

foobar=${argv[1]:P}

나는 이 오류가 foobar 할당과 관련이 있다는 것을 알고 있지만 이것이 어디에 P사용되는지, 왜 유용한지 찾을 수 없습니다. 어떤 아이디어가 있나요?

답변1

아마도 다음으로 교체해보십시오.

foobar=$(readlink -f ${argv[1]})

:P에서는 필요하지 않은 파일이 존재하는 경우에만 작동합니다.

답변2

수정 :P자가 Zsh에 추가되었습니다.버전 5.3이므로 이전 버전에서는 사용할 수 없습니다. 유사하지만 완전히 동일하지는 않은 접근 방식은 다음과 같습니다.:A대신 수정자를 사용하십시오.

에서 zshexpn(1):

수정자:a

파일 이름을 절대 경로로 바꿉니다. 필요한 경우 현재 디렉터리 앞에 추가합니다. 제거하다 '.' 경로 세그먼트; '..' 경로 세그먼트와 바로 앞에 있는 세그먼트를 제거합니다.

수정자:A

'a' 수정자처럼 파일 이름을 절대 경로로 바꾼 다음 그 결과를 realpath(3) 라이브러리 함수를 통해 전달하여 기호 링크를 해결합니다.

참고: realpath(3) 라이브러리 함수가 없는 시스템에서는 기호 링크가 해결되지 않으므로 해당 시스템에서 'a'와 'A'는 동일합니다.

참고: foo:A 및 realpath(foo)는 일부 입력에서 다릅니다. realpath(foo) 의미 체계에 대해서는 P수정자를 참조하세요.

수정자:P

realpath(3)와 같이 파일 이름을 절대 경로로 바꿉니다. 결과 경로는 절대 경로이며 '.'이 없습니다. '..' 구성요소도 아니고 입력 파일 이름과 동일한 디렉토리 항목을 참조합니다.

realpath(3)와 달리 존재하지 않는 후행 구성 요소가 허용되고 보존됩니다.

좀 더 관련 없는 세부 사항은 생략했으므로 매뉴얼 페이지를 꼭 확인하세요. "역사 확장" 섹션, 하위 섹션 "수정자".

관련 정보