쉘 패턴 매칭 로직

쉘 패턴 매칭 로직

둘 사이의 논리적인 차이점은 무엇인가

  1. ll -d !(.*@(ry|rc))
  2. ll -d !(.*{ry,rc})

?

내 홈 디렉토리에서 이를 사용하면 두 번째는 일치 .bash_history하고 .xinputrc첫 번째는 일치하지 않습니다.

노트:

$ shopt extglob
extglob         on

답변1

ll -d -- !(.*{ry,rc})

와일드카드와 중괄호 확장을 결합합니다. 먼저 이것을 다음과 같이 확장합니다.

ll -d -- !(.*ry) !(.*rc)

구가 개별적으로 확장됩니다. 첫 번째 일치 .inputrc( bash -O extglob그러나 ksh해당 문법의 소스나 시뮬레이션 zsh에서는 일치하지 않습니다 ksh. 이는 숨겨진 파일이고 도트 파일은 명시적으로 요청되지 않기 때문입니다).

이러한 glob이 어떤 파일과도 일치하지 않는 디렉터리에서 이를 확인할 수 있습니다(이 경우 glob은 변경되지 않고 유지되며 bash이는 해결할 수 있는 또 다른 버그 기능입니다 shopt -s failglob). 예를 들어 읽기 권한이 없는 디렉터리에서 중간에:

$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)

그리고

ll -d -- !(.*@(ry|rc))

그것은 무리입니다.

여기에서 다음 작업도 수행할 수 있습니다.

ll -d -- !(.*r[cy])

또는:

ll -d -- !(.*rc|.*ry)

bash이 확장에는 및 도 포함되어 있습니다 .. ..해당 파일을 제외하고 싶지만(아마 그럴 것이라고 확신합니다) 숨겨진 파일은 계속 포함하려면 다음을 수행해야 합니다.

shopt -s dotglob
ll -d -- !([.]*@(rc|ry))

또는 명시적으로 제외할 수도 있습니다.

ll -d -- !(.*@(rc|ry)|.|..)

에서는 zsh -o extendedglob다음을 수행합니다.

ll -d -- ^.*(rc|ry)(D)

(이 glob에 대해서만 활성화됩니다 (D)).dotglob

관련 정보