zsh: 확장된 글로벌 문제를 항상 활성화하시겠습니까?

zsh: 확장된 글로벌 문제를 항상 활성화하시겠습니까?

최근에 접한

setopt extended_glob

...확장된 와일드카드를 활성화하려면 다음과 같은 특정 패턴을 제외하는 등 멋진 와일드카드를 많이 추가할 수 있습니다.

ls ^foo*

... ls일치하는 패턴을 제외하고 현재 디렉터리의 모든 경로에 사용됩니다 foo*.

setopt extended_glob나는 당신의 것을 넣는 것을 제안하는 튜토리얼을 찾았 .zshrc지만 많은 zsh 구성 템플릿이 해당 옵션을 놓치고 옵션은 다음과 같습니다.기본적으로 비활성화됨몇 가지 단점이나 부작용이 있습니까?

extended_glob아니면 항상 하나에 넣어 활성화하는 것이 전혀 무해합니까 .zshrc?

답변1

근본적인 문제는 이것이 ^파일 이름에서 상당히 유효한 문자이므로 이를 포함하는 패턴의 의미가 옵션 설정 여부에 따라 변경된다는 것입니다.

$ touch 'foo' 'bar' '^foo' '^bar'
$ ls ^foo*
^foo
$ setopt extendedglob
$ ls ^foo*           
bar  ^bar  ^foo

표준 쉘은 이것을 일반 문자로 취급하므로 ^호환성을 위해 이 기능은 기본적으로 비활성화될 수 있습니다.

어떤 옵션이 활성화되어 있는지 기억하는 한, 즉 쉘이 glob을 해석하는 방법을 알고 있는 한 extended_glob대화식 사용에서 해당 옵션을 활성화하는 것은 문제가 되지 않습니다.

이는 예상하지 못했지만 이상한 파일 이름을 사용하는 스크립트의 경우 문제가 될 수 있지만 비대화형 쉘은 이를 읽을 수 없으므로 .zshrc거기에 설정하면 작동합니다. 로 설정하지 마십시오 .zshenv.


ksh 스타일 확장 glob( @(...|...)setopt kshglob)에는 zsh가 glob 브래킷을 처리하는 방식과 충돌하기 때문에 비슷한 문제가 있습니다. 설정 여부 @(f|b)에 따라 의미가 다릅니다.kshglob

관련 정보