Porque nesse caso, ele entra em conflito com qualificadores de glob, já que está no final do padrão. *(a1)é considerado como os arquivos acessados pela última vez no último dia. (a1)é tratado como um qualificador glob. Portanto, no seu !(a)caso, o zsh reclama sobre o número de dias ausente após o aqualificador glob (aqui aplicado ao arquivo chamado !).
Em zshglobs, (...)o agrupamento é usado principalmente para a (foo|bar)alternância, portanto, adicionar a |é uma maneira documentada de garantir que um final (...)não seja tratado como um qualificador de glob.
Outra alternativa documentada é dobrar o parêntese ( !((a))) ou você pode adicionar um qualificador glob vazio (como !(a)(-)).
Para remover completamente essa ambiguidade, pode-se desativar a bare_glob_qualopção ( set +o bareglobqual), após o que os qualificadores glob devem ser escritos com a extendedglob(#q...)sintaxe ( *(#qa1)aqui ).
A kshglobopção ( adicionada em 1998 , aproximadamente na mesma época bashadicionada extglobembora o bash não tivesse nenhum glob estendido antes disso) é principalmente para o kshmodo de emulação ( emulate ksh), para zshpoder executar kshscripts, onde kshglobestá habilitado e bareglobqualestá desabilitado. Quando foi introduzido pela primeira vez, depois de habilitar kshglob, você precisaria especificar qualificadores glob -(...)para evitar esse tipo de conflito, mas isso causava muita confusão e entrava em conflito com a @-(...)sintaxe de ksh93, as opções (#q...)e bareglobqualforam introduzidas posteriormente.
zshos usuários geralmente preferem os próprios operadores glob ( set -o extendedglob) estendidos do zsh que são mais fáceis de digitar (para a maioria) e mais poderosos (do que os ksh88 habilitados com kshglobtambém encontrados em bash -O extglob).
Por exemplo, !(foo)seria escrito ^foo. O !(foo|)barequivalente, no entanto, seria mais longo como (^(foo|))bar.
Outras traduções de ksh88 -> zsh:
*(x)->x#
+(x)->x##
@(x|y)->x|y
?(x)->(x|)
Algumas traduções ksh93 -> zsh:
~(i:x)-> (#i)x(não diferencia maiúsculas de minúsculas)
~(N)x-> x(N)(nullglob, originado em zsh)
{1,5}(x)->x(#c1,5)
@(foo&bar)-> foo~^barou^(^foo|^bar)
Alguns encontrados apenas em zsh:
<1-23>(intervalo de números decimais)
pattern~except
pattern(glob-qualifier)(o recurso matador de zsh globs)
(pattern/)#(qualquer nível de subdiretórios que correspondam ao pattern; a **/versão simplificada de (*/)#também foi adicionada ao ksh93 e ao bash recentemente)
Porque nesse caso, ele entra em conflito com qualificadores de glob, já que está no final do padrão.
*(a1)
é considerado como os arquivos acessados pela última vez no último dia.(a1)
é tratado como um qualificador glob. Portanto, no seu!(a)
caso, o zsh reclama sobre o número de dias ausente após oa
qualificador glob (aqui aplicado ao arquivo chamado!
).Em
zsh
globs,(...)
o agrupamento é usado principalmente para a(foo|bar)
alternância, portanto, adicionar a|
é uma maneira documentada de garantir que um final(...)
não seja tratado como um qualificador de glob.Outra alternativa documentada é dobrar o parêntese (
!((a))
) ou você pode adicionar um qualificador glob vazio (como!(a)(-)
).Para remover completamente essa ambiguidade, pode-se desativar a
bare_glob_qual
opção (set +o bareglobqual
), após o que os qualificadores glob devem ser escritos com aextendedglob
(#q...)
sintaxe (*(#qa1)
aqui ).A
kshglob
opção ( adicionada em 1998 , aproximadamente na mesma épocabash
adicionadaextglob
embora o bash não tivesse nenhum glob estendido antes disso) é principalmente para oksh
modo de emulação (emulate ksh
), parazsh
poder executarksh
scripts, ondekshglob
está habilitado ebareglobqual
está desabilitado. Quando foi introduzido pela primeira vez, depois de habilitarkshglob
, você precisaria especificar qualificadores glob-(...)
para evitar esse tipo de conflito, mas isso causava muita confusão e entrava em conflito com a@-(...)
sintaxe deksh93
, as opções(#q...)
ebareglobqual
foram introduzidas posteriormente.zsh
os usuários geralmente preferem os próprios operadores glob (set -o extendedglob
) estendidos do zsh que são mais fáceis de digitar (para a maioria) e mais poderosos (do que os ksh88 habilitados comkshglob
também encontrados embash -O extglob
).Por exemplo,
!(foo)
seria escrito^foo
. O!(foo|)bar
equivalente, no entanto, seria mais longo como(^(foo|))bar
.Outras traduções de ksh88 -> zsh:
*(x)
->x#
+(x)
->x##
@(x|y)
->x|y
?(x)
->(x|)
Algumas traduções ksh93 -> zsh:
~(i:x)
->(#i)x
(não diferencia maiúsculas de minúsculas)~(N)x
->x(N)
(nullglob, originado em zsh){1,5}(x)
->x(#c1,5)
@(foo&bar)
->foo~^bar
ou^(^foo|^bar)
Alguns encontrados apenas em
zsh
:<1-23>
(intervalo de números decimais)pattern~except
pattern(glob-qualifier)
(o recurso matador de zsh globs)(pattern/)#
(qualquer nível de subdiretórios que correspondam aopattern
; a**/
versão simplificada de(*/)#
também foi adicionada ao ksh93 e ao bash recentemente)***/*
(globbing recursivo seguindo links simbólicos).(#a1)foobar
(correspondência aproximada, permitindo alguns erros, aqui 1)