~ 빈 패턴을 사용한 전역 연산자 동작

~ 빈 패턴을 사용한 전역 연산자 동작

문서에 따르면,~ 다음과 같이 사용할 수 있습니다.글로벌 운영자EXTENDED_GLOB설정 되면 다음과 같은 생성자를 허용합니다.

print -rl glob*~globA*~glob*B

따라서 일치 하지만 합계 glob*와 일치하지 않는 모든 것 . 좋아요:globA*glob*B

touch file{1,2,3,4{,5}}
setopt extendedglob

지금

print -rl file*~f*3~file4* 

동작은 예상대로입니다.

file1
file2

하지만 빈 패턴을 사용하면

print -rl file*~f*3~~file4*

인쇄

file1
file2
file3

첫 번째 glob의 결과를 필터링하는 데 마지막 패턴만 사용되는 것처럼 보입니다(비어 있는 두 번째와 세 번째는 무시됩니다).

print -rl file*~f*3~file4*~~

생산하다

file1
file2
file4
file45

이제 두 번째 것만 사용됩니다...
이상한 점은 첫 번째 물결표 뒤의 패턴이 비어 있으면 전혀 작동하지 않는다는 것입니다.

print -rl file*~~f*3~file4*

오류

zsh: no matches found: file*~~f*3~file4*

내가 여기서 무엇을 놓치고 있는 걸까요?


zsh 5.3.1중요하다면...

답변1

~~빈 패턴을 사용하지 마십시오. 대신 다음 두 가지 중 하나를 수행합니다.

  • 전체 패턴의 끝 부분에서 문자 그대로 " "와 일치합니다 ~~.
  • 중간에서 단일 " " 문자를 일치시킨 ~다음 제외된 다음 패턴으로 이동합니다(즉, 리터럴 ~뒤에 ~연산자가 옵니다).

몇 가지 추가 항목으로 파일 세트를 확장하면 다음과 같은 일이 발생하는 것을 볼 수 있습니다.

touch file3~ file3~~ file4~ file4~~

이제 첫 번째 이상한 명령을 실행하십시오.

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~

file3~세 가지 모두 file4*와 마찬가지로 제외되었습니다. file3~~일치하지 않기 때문에 여전히 존재합니다 f*3~.

두번째:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~

유일한 일치 항목이므로 Only가 file4~~제외되었습니다 file4*~~.

이제 마지막 사례에는 다음과 같은 출력이 있습니다.

print -rl file*~~f*3~file4*
file3~
file3~~

이는 일치하지만 일치하지 않는 두 파일이기 때문입니다 file*~.f*3file4*

적어도 리터럴 이후 연산자의 경우에는 구문 분석 버그일 수 있지만 null 제외 패턴의 사용을 볼 수 없으므로 다른 작업을 수행해야 하는지 잘 모르겠습니다.

관련 정보