2009-04-30 10 views

Odpowiedz

8

To nie jest błąd i działa dobrze w słowach. Problem polega na tym, że {1..9} nie jest wyrażeniem wieloznacznym, takim jak *; jak pokazuje twój przykład echa, jest to wielokrotne rozwijanie. Tak więc twój przykład zgrep jest dokładnie taki sam, jak gdybyś wpisał każdą alternatywną wersję do wiersza poleceń, a ponieważ nie ma stron podręcznika zaczynających się od zsh w man2, to powoduje to błąd. (To erroring na niepowodzenia znaleźć mecz, a nie coś nierozerwalnie związany swojej ekspansji sekwencji nawiasów).

Jeśli to zrobił, z drugiej strony:

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

chcesz uzyskać wyniki oczekujesz, ponieważ [1-9] jest normalnym wyrażeniem wieloznacznym.

+0

Mamy więc dwie spacje: jedna nie jest symbolem wieloznacznym a drugi to przestrzeń wieloznaczna. Jeśli istnieje jeden symbol wieloznaczny, zmusza mnie to do używania tylko symboli wieloznacznych. W ten sam sposób możesz używać tylko znaków bez symboli wieloznacznych. - - Dziękuję za Twoją odpowiedź! –

+2

@Masi: Niezupełnie. Gdybym miał katalog z 1-hello.gif, 2-world.gif, ..., 20-foobar.gif, '{1..20} - *. Gif' działałby idealnie idealnie, aby je dopasować, podczas gdy' [1-20] - *. Gif "pasowałoby tylko do pierwszych dwóch. Spowoduje to ten sam błąd, co w pytaniu, jeśli brakuje któregokolwiek z plików o numerach porządkowych. – ephemient

+0

@ephemient: Masz na myśli, że [1-20] Plik nie działa, jeśli nie masz na przykład 7File? - Jeśli tak, to jaka jest korzyść z używania [1-20] zamiast {1..20}, które nie powoduje problemu? –

6

W zsh, jeśli chcesz używać zakresów w nazwach plików, zle oferuje <1-n> na dowolnych rzeczywistych nazwach, na które może się rozwinąć. To znaczy:

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

A potem uderzył <Tab> tuż po końcowym b zostawi cię z print a0b a1b a5b a7b rozszerzonym na linii.

Dla wszystkich innych zamiarów i celów - może pełnych wymagań zasięgu, brak pliku i używania skryptów - Chciałbym wyrazić to za pomocą pętli idiomatyczne raczej zwięzły zsh jako:

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

pozwoli przetwarzać całość zakres sekwencji liczb od 1 do 50 :), po którym możesz wykonywać wszelkiego rodzaju użyteczne rzeczy, takie jak zbiór plików, który jeszcze nie istnieje:

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