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}?

È stato utile?

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top