2009-04-30 11 views

Antwort

8

Es ist kein Fehler, und es funktioniert in Worte gut. Das Problem, das Sie hier haben, ist, dass {1..9} kein Platzhalter-Ausdruck wie * ist; Wie Ihr Echo-Beispiel zeigt, handelt es sich um eine iterative Erweiterung. So ist Ihr zgrep-Beispiel genau so, als hätten Sie jede alternative Version in die Befehlszeile eingegeben, und da es keine man-Seiten gibt, die mit zsh in man2 beginnen, wird ein Fehler ausgegeben. (Es ist erroring auf einem Fehler, um eine Übereinstimmung zu finden, irgendetwas nicht eigen im Zusammenhang mit Ihrer Orthese Sequenz Expansion.)

Wenn Sie dies getan haben, auf der anderen Seite:

zgrep -c compinit /usr/share/man/man[1-9]/zsh* 

Sie die Ergebnisse bekommen würden Sie erwarten, weil [1-9] ein normaler Platzhalterausdruck ist.

+0

so haben wir zwei Räume: ein nicht-Wildcard und der andere ist Platzhalter. Wenn es einen Platzhalter gibt, zwingt es mich, nur Platzhalterzeichen zu verwenden. Auf die gleiche Weise können Sie nur Nicht-Wildcard-Zeichen verwenden. - - Vielen Dank für Ihre Antwort! –

+2

@Masi: Nicht ganz. Wenn ich ein Verzeichnis mit 1-hello.gif, 2-world.gif, ..., 20-foobar.gif hätte, würde '{1..20} - *. Gif' vollkommen in Ordnung sein, um ihnen zu entsprechen, während' [1-20] - *. Gif' würde nur den ersten beiden entsprechen. Dies führt zu dem gleichen Fehler wie in Ihrer Frage, wenn eine der sequenziell nummerierten Dateien fehlt. – ephemient

+0

@ephemient: Meinst du, dass [1-20] Datei nicht funktioniert, wenn Sie zum Beispiel 7File nicht haben? - Wenn ja, welchen Nutzen hat die Verwendung von [1-20] anstelle von {1..20}, wodurch Sie nicht das Problem haben? –

6

In zsh, wenn Sie Bereiche in Dateinamen verwenden möchten, bietet zle <1-n> auf echte Namen, auf denen es erweitert werden kann. Das heißt:

$ touch a0b a1b a5b a7b 
$ print a<0-100>b 

Und dann traf <Tab> direkt nach dem letzten b würden Sie mit print a0b a1b a5b a7b auf der Linie erweitert verlassen.

Für alle anderen Absichten und Zwecke - vielleicht verschiedenen Anforderungen, nicht-Datei und Scripting - ich würde ausdrücken dies die eher knappe idiomatische zsh-Schleife als:

for n ({1..50}); do print $n; done 

Erlaubt Ihnen den gesamten Prozess Sequenzbereich von Zahlen 1 bis 50 :), nach dem Sie viele nützliche Dinge tun können, mit, wie eine Dateisammlung, die noch nicht existiert:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33] 
Verwandte Themen