이 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)와 달리 존재하지 않는 후행 구성 요소가 허용되고 보존됩니다.
좀 더 관련 없는 세부 사항은 생략했으므로 매뉴얼 페이지를 꼭 확인하세요. "역사 확장" 섹션, 하위 섹션 "수정자".