Risposte:
Perché in questo caso, è in conflitto con i qualificatori glob nudi poiché è alla fine del modello. *(a1)
viene preso come ultimo accesso ai file nell'ultimo giorno. (a1)
viene considerato come un qualificatore glob. Quindi nel tuo !(a)
caso, zsh si lamenta del numero mancante di giorni dopo il a
qualificatore glob (qui applicato al file chiamato !
).
Nei zsh
globs, il (...)
raggruppamento viene utilizzato principalmente per l' (foo|bar)
alternanza, quindi l'aggiunta di a |
è un modo documentato per assicurarsi che un trailing (...)
non sia trattato come un qualificatore glob.
Un'altra alternativa documentata è raddoppiare la parentesi ( !((a))
) o potresti aggiungere un qualificatore glob vuoto (come !(a)(-)
).
Per rimuovere completamente questa ambiguità, è possibile disattivare l' bare_glob_qual
opzione ( set +o bareglobqual
), dopo di che i qualificatori glob devono essere scritti con la extendedglob
(#q...)
sintassi ( *(#qa1)
qui).
L' kshglob
opzione ( aggiunta nel 1998 , all'incirca nello stesso tempo ha bash
aggiunto la sua extglob
sebbene bash non avesse alcun globo esteso prima) è principalmente lì per la ksh
modalità di emulazione ( emulate ksh
), per zsh
essere in grado di eseguire ksh
script, dove kshglob
è abilitato e bareglobqual
disabilitato. Quando è stato introdotto per la prima volta, dopo averlo abilitato kshglob
, è necessario specificare i qualificatori glob -(...)
per evitare quel tipo di conflitto ma che ha causato troppa confusione e in conflitto con la @-(...)
sintassi di ksh93
, le opzioni (#q...)
e bareglobqual
sono state introdotte in seguito.
zsh
gli utenti generalmente preferiscono gli set -o extendedglob
operatori glob ( ) estesi di zsh che sono più facili da digitare (per la maggior parte) e più potenti (rispetto a quelli ksh88 abilitati con cui kshglob
si trovano anche in bash -O extglob
).
Ad esempio, !(foo)
verrebbe scritto ^foo
. L' !(foo|)bar
equivalente sarebbe comunque più lungo (^(foo|))bar
.
Altre traduzioni di ksh88 -> zsh:
*(x)
-> x#
+(x)
-> x##
@(x|y)
-> x|y
?(x)
-> (x|)
Alcune traduzioni di ksh93 -> zsh:
~(i:x)
-> (#i)x
(senza distinzione tra maiuscole e minuscole)~(N)x
-> x(N)
(nullglob, originato in zsh){1,5}(x)
-> x(#c1,5)
@(foo&bar)
-> foo~^bar
o^(^foo|^bar)
Alcuni si trovano solo in zsh
:
<1-23>
(intervallo di numeri decimali)pattern~except
pattern(glob-qualifier)
(la caratteristica killer di zsh globs)(pattern/)#
(qualsiasi livello di sottodirectory corrispondente a pattern
; la **/
versione semplificata di è (*/)#
stata aggiunta anche a ksh93 e bash di recente)***/*
(globbing ricorsivo seguendo i symlink).(#a1)foobar
(corrispondenza approssimativa, che consente alcuni errori, qui 1)