Cela fonctionne en bash:
touch a b c
echo !(a)
Si j'exécute le script ci-dessus dans zsh (avec kshglob
on), il se plaint:
zsh: number expected
Si j'ajoute |
après a
, ça marche:
echo !(a|)
Pourquoi?
Parce que dans ce cas, il entre en conflit avec les qualificateurs de glob nus car il est à la fin du modèle. *(a1)
est pris comme dernier accès aux fichiers le dernier jour. (a1)
est traité comme un qualificatif glob. Donc dans votre !(a)
cas, zsh se plaint du nombre de jours manquant après le a
qualificatif glob (appliqué ici au fichier appelé !
).
Dans les zsh
globs, le (...)
regroupement est principalement utilisé pour l' (foo|bar)
alternance, l'ajout de a |
est donc un moyen documenté de s'assurer qu'un suivi (...)
n'est pas traité comme un qualificatif de glob.
Une autre alternative documentée consiste à doubler la parenthèse ( !((a))
) ou vous pouvez ajouter un qualificateur de glob vide (comme !(a)(-)
).
Pour supprimer complètement cette ambiguïté, on peut désactiver l' bare_glob_qual
option ( set +o bareglobqual
), après quoi les qualificatifs glob doivent être écrits avec la extendedglob
(#q...)
syntaxe ( *(#qa1)
ici).
L' kshglob
option ( ajoutée en 1998 , à peu près en même temps a bash
ajouté que son extglob
bash n'avait pas de glob étendu avant) est principalement disponible pour le ksh
mode d'émulation ( emulate ksh
), pour zsh
pouvoir exécuter des ksh
scripts, où kshglob
est activé et bareglobqual
désactivé. Quand il a été introduit pour la première fois, après l'activation kshglob
, vous devez spécifier des qualificatifs glob -(...)
pour éviter ce type de conflit, mais cela a causé trop de confusion et est entré en conflit avec la @-(...)
syntaxe de ksh93
, les options (#q...)
et bareglobqual
ont été introduites plus tard.
zsh
les utilisateurs préfèrent généralement les propres set -o extendedglob
opérateurs glob ( ) étendus de zsh qui sont plus faciles à taper (pour la plupart) et plus puissants (que ceux ksh88 activés avec kshglob
également trouvés dans bash -O extglob
).
Par exemple, !(foo)
serait écrit ^foo
. L' !(foo|)bar
équivalent serait cependant plus long (^(foo|))bar
.
Autres traductions de ksh88 -> zsh:
*(x)
-> x#
+(x)
-> x##
@(x|y)
-> x|y
?(x)
-> (x|)
Quelques traductions de ksh93 -> zsh:
~(i:x)
-> (#i)x
(insensible à la casse)~(N)x
-> x(N)
(nullglob, originaire de zsh){1,5}(x)
-> x(#c1,5)
@(foo&bar)
-> foo~^bar
ou^(^foo|^bar)
Certains ne se trouvent que dans zsh
:
<1-23>
(plage de nombres décimaux)pattern~except
pattern(glob-qualifier)
(la fonction de tueur des globes zsh)(pattern/)#
(n'importe quel niveau de sous-répertoires correspondant à pattern
; la **/
version simplifiée de (*/)#
a également été ajoutée à ksh93 et bash récemment)***/*
(globbing récursif suivant les liens symboliques).(#a1)foobar
(correspondance approximative, permettant quelques erreurs, ici 1)