zsh에서 glob 한정자를 비활성화합니다.

zsh에서 glob 한정자를 비활성화합니다.

zsh로 glob 한정자를 비활성화하는 방법이 있습니까? 이것은 유용한 기능인 것 같지만 일반 괄호를 사용하는 데 방해가 됩니다.

나는 그것을 사용하여 ag파일을 검색하고 있으며 ag mymethod(param)이로 인해 zsh가 불평하게 됩니다 missing end of name. 내 주장을 인용할 필요는 없습니다. 저는 glob 한정자를 실제로 사용하지 않았기 때문에 이를 비활성화해야 한다고 생각했지만 인터넷 검색 결과는 나오지 않았습니다.

답변1

설정을 해제하여 구문을 비활성화할 수 있습니다.PATTERN(QUALIFIERS)bare_glob_qual옵션:

setopt no_bare_glob_qual

옵션인 경우extended_glob설정되어 있습니다(설정해야 합니다. 설정하지 않는 유일한 이유는 특이한 구문을 사용하는 드문 스크립트와의 하위 호환성 때문입니다). glob 한정자에 대한 또 다른 구문이 있습니다: . 따라서 zsh의 주요 기능 중 하나인 glob 한정자를 계속 사용할 수 있지만 더 많은 것을 입력해야 합니다.PATTERN(#qQUALIFIERS)

Zsh를 사용하면 와일드카드 확장(와일드카드 지정)을 완전히 비활성화할 수 있는데, 이는 더 나은 옵션처럼 보입니다. 명령 앞에 가 붙으면 noglob해당 매개변수에 와일드카드가 수행되지 않습니다. 예를 들어 을 ?매개변수로 포함하는 URL을 입력하려면 을 입력하면 wget됩니다 .alias wget='noglob wget'alias ag='noglob ag'ag mymethod(param)

ag검색 패턴과 파일 이름을 모두 매개변수로 사용하는 경우 와일드카드를 비활성화하는 것은 좋지 않습니다. 매개변수를 구문 분석할 수 있으면 ag해당 매개변수에 대해 와일드카드 확장을 수행할 수 있습니다. 구문을 모르기 때문에 인수 없이 옵션만 취하고 옵션이 아닌 첫 번째 인수는 패턴이고 나머지는 파일이라고 ag가정하는 예를 들겠습니다 .ag

ag () {
local i=1
  while [[ ${(P)i} = -* ]]; do ((++i)); done
  if ((i < $#)); then
    set -- "${(@)@[1,$i]}" $~@[$((i+1)),$#]
  fi
}
alias ag='noglob ag'

답변2

설정 SH_GLOB옵션.

setopt sh_glob

에서 man zshoptions:

SH_GLOB는 와일드카드 인수와 명령 대체 결과 및 쉘이 패턴을 허용하는 다른 위치에 사용되는 "(", "|", ")" 및 "<"의 특수 의미를 비활성화합니다. SH_GLOB가 설정되었지만 KSH_GLOB가 설정되지 않은 경우 여는 대괄호 앞에 공백이 없으며 쉘은 대괄호 안에 포함된 하위 쉘 표현식을 해석할 수 있습니다. 예를 들어 (true)는 ! 그 뒤의 공간. 이 옵션은 zsh가 sh 또는 ksh로 호출되는 경우 기본적으로 설정됩니다.

관련 정보