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로 호출되는 경우 기본적으로 설정됩니다.