이것은 bash에서 작동합니다.
touch a b c
echo !(a)
kshglob
zsh(open ) 에서 위 스크립트를 실행하면 다음과 같은 오류가 발생합니다.
zsh: number expected
|
그 후에 추가 하면 a
작동합니다.
echo !(a|)
왜?
답변1
이 경우에는 다음과 같기 때문입니다.네이키드 글로브 한정자왜냐하면 패턴의 마지막에 있기 때문이죠. *(a1)
가장 최근 날짜에 마지막으로 액세스한 파일로 간주됩니다. (a1)
전역 한정자로 처리됩니다. 따라서 귀하의 !(a)
경우 zsh는 glob 한정자 이후 누락된 일 수에 대해 불평합니다 a
(여기서는 이름이 파일에 적용됨 !
).
zsh
glob 에서 그룹화는 주로 대체 (...)
에 사용되므로 a를 추가하는 것은 후행이 glob 한정자로 간주되지 않도록 하는 문서화된 방법입니다.(foo|bar)
|
(...)
문서화된 또 다른 대안은 이중 괄호( !((a))
)이거나 빈 glob 한정자(예: !(a)(-)
)를 추가할 수 있습니다.
이러한 모호성을 완전히 제거하려면 bare_glob_qual
옵션( set +o bareglobqual
)을 해제한 후 구문 extendedglob
(#q...)
( *(#qa1)
여기)을 사용하여 glob 한정자를 작성해야 합니다.
옵션 kshglob
(1998년에 추가됨, 비슷한 시기에 bash
추가되었지만 extglob
이전에는 bash에 glob에 대한 확장이 없었음에도 불구하고)는 활성화 및 비활성화된 스크립트를 실행할 수 있도록 ksh
에뮬레이션 모드( emulate ksh
) 에서 주로 사용되었습니다 . 처음 도입되었을 때 이러한 충돌을 피하기 위해 활성화되면 glob 한정자를 지정해야 했지만 이로 인해 너무 많은 혼란이 발생하고 구문과 충돌이 발생했으며 이후 및 옵션이 도입되었습니다 .zsh
ksh
kshglob
bareglobqual
kshglob
-(...)
@-(...)
ksh93
(#q...)
bareglobqual
zsh
set -o extendedglob
사용자는 일반적 으로 입력하기 쉽고(대부분의 사람들에게) 더 강력한( kshglob
ksh88 연산자도 활성화된 것보다) zsh의 자체 확장 glob( ) 연산자를 선호합니다 bash -O extglob
.
예를 들어 !(foo)
는 로 작성됩니다 ^foo
. 그러나 이에 상응하는 내용 !(foo|)bar
은 (^(foo|))bar
.
기타 ksh88 -> zsh 번역:
*(x)
->x#
+(x)
->x##
@(x|y)
->x|y
?(x)
->(x|)
일부 ksh93 -> zsh 번역:
~(i:x)
->(#i)x
(대소문자를 구분하지 않음)~(N)x
->x(N)
(zsh에서 유래된 nullglob){1,5}(x)
->x(#c1,5)
@(foo&bar)
->foo~^bar
또는^(^foo|^bar)
일부는 다음에서만 발견됩니다 zsh
.
<1-23>
(소수점 범위)pattern~except
pattern(glob-qualifier)
(zsh glob의 킬러 기능)(pattern/)#
(하위 디렉토리의 모든 레벨과 일치합니다 .pattern
최근 ksh93 및 bash에도**/
단순화된 버전이 추가되었습니다)(*/)#
***/*
(심볼릭 링크 뒤의 재귀 와일드카드)(#a1)foobar
(대략적인 일치, 일부 오류는 허용됨, 여기서는 1)- ...