kshglob을 켜도(단일 모드) zsh에서 사용할 수 없는 이유는 무엇입니까?

kshglob을 켜도(단일 모드) zsh에서 사용할 수 없는 이유는 무엇입니까?

이것은 bash에서 작동합니다.

touch a b c
echo !(a)

kshglobzsh(open ) 에서 위 스크립트를 실행하면 다음과 같은 오류가 발생합니다.

zsh: number expected

|그 후에 추가 하면 a작동합니다.

echo !(a|)

왜?

답변1

이 경우에는 다음과 같기 때문입니다.네이키드 글로브 한정자왜냐하면 패턴의 마지막에 있기 때문이죠. *(a1)가장 최근 날짜에 마지막으로 액세스한 파일로 간주됩니다. (a1)전역 한정자로 처리됩니다. 따라서 귀하의 !(a)경우 zsh는 glob 한정자 이후 누락된 일 수에 대해 불평합니다 a(여기서는 이름이 파일에 적용됨 !).

zshglob 에서 그룹화는 주로 대체 (...)에 사용되므로 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 한정자를 지정해야 했지만 이로 인해 너무 많은 혼란이 발생하고 구문과 충돌이 발생했으며 이후 및 옵션이 도입되었습니다 .zshkshkshglobbareglobqualkshglob-(...)@-(...)ksh93(#q...)bareglobqual

zshset -o extendedglob사용자는 일반적 으로 입력하기 쉽고(대부분의 사람들에게) 더 강력한( kshglobksh88 연산자도 활성화된 것보다) 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)
  • ...

관련 정보