Perché riscontro questo errore utilizzando {1..9} in zsh?
Domanda
Eseguo il seguente codice
zgrep -c compinit /usr/share/man/man{1..9}/zsh*
Ottengo
zsh: no matches found: /usr/share/man/man2/zsh*
Questo è strano, dal momento che le seguenti opere
echo Masi{1..9}/masi
Questo mi suggerisce che il problema potrebbe essere un bug in Zsh.
Quanto sopra è un bug in Zsh per {1..9}?
Soluzione
Non è un bug e funziona bene all'interno delle parole. Il problema che stai riscontrando qui è che {1..9}
non è un'espressione jolly come *
; come mostra il tuo esempio di eco, è un'espansione iterativa. Quindi il tuo esempio di zgrep è esattamente lo stesso di se tu avessi digitato ciascuna versione alternativa nella riga di comando, e quindi dato che non ci sono pagine man che iniziano con zsh in man2, si verifica un errore. (Si sta sbagliando a causa di un errore nel trovare una corrispondenza, non nulla di intrinsecamente correlato all'espansione della sequenza di parentesi graffe.)
Se lo hai fatto, d'altra parte:
zgrep -c compinit /usr/share/man/man[1-9]/zsh*
otterrai i risultati che ti aspetti, perché [1-9]
è una normale espressione jolly.
Altri suggerimenti
In zsh, se si desidera utilizzare intervalli nei nomi di file, zle offre <1-n>
su tutti i nomi reali su cui può espandersi. Vale a dire:
$ touch a0b a1b a5b a7b
$ print a<0-100>b
E poi premi <Tab>
subito dopo il b
finale ti lascerebbe con print a0b a1b a5b a7b
espanso sulla linea.
Per tutti gli altri scopi - forse i requisiti dell'intera gamma, l'uso di non file e script - lo esprimerei usando il ciclo zsh idiomatico piuttosto succinto come:
for n ({1..50}); do print $n; done
Ti consentirà di elaborare l'intero intervallo di sequenza dei numeri da 1 a 50 :) dopo di che puoi fare ogni sorta di cose utili con, come una raccolta di file che non esiste ancora:
arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33]