Perché non posso usare! (Modello singolo) in zsh anche dopo aver acceso kshglob?


8

Questo funziona in bash:

touch a b c
echo !(a)

Se eseguo sopra lo script in zsh (con kshglobon), mi lamento:

zsh: number expected

Se aggiungo |dopo a, funziona:

echo !(a|)

Perché?

Risposte:


10

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 aqualificatore glob (qui applicato al file chiamato !).

Nei zshglobs, 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_qualopzione ( set +o bareglobqual), dopo di che i qualificatori glob devono essere scritti con la extendedglob (#q...)sintassi ( *(#qa1)qui).

L' kshglobopzione ( aggiunta nel 1998 , all'incirca nello stesso tempo ha bashaggiunto la sua extglobsebbene bash non avesse alcun globo esteso prima) è principalmente lì per la kshmodalità di emulazione ( emulate ksh), per zshessere in grado di eseguire kshscript, dove kshglobè abilitato e bareglobqualdisabilitato. 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 bareglobqualsono state introdotte in seguito.

zshgli utenti generalmente preferiscono gli set -o extendedgloboperatori glob ( ) estesi di zsh che sono più facili da digitare (per la maggior parte) e più potenti (rispetto a quelli ksh88 abilitati con cui kshglobsi trovano anche in bash -O extglob).

Ad esempio, !(foo)verrebbe scritto ^foo. L' !(foo|)barequivalente 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~^baro^(^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)
  • ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.