Почему я получаю эту ошибку, используя {1..9} в zsh? - PullRequest
7 голосов
/ 30 апреля 2009

Я запускаю следующий код

zgrep -c compinit /usr/share/man/man{1..9}/zsh*

Я получаю

zsh: no matches found: /usr/share/man/man2/zsh*

Это странно, так как работает следующее

echo Masi{1..9}/masi

Это наводит меня на мысль, что проблема может заключаться в ошибке в Zsh.

Является ли приведенная выше ошибка в Zsh для {1..9}?

Ответы [ 2 ]

9 голосов
/ 30 апреля 2009

Это не ошибка, и она прекрасно работает внутри слов. Проблема в том, что {1..9} не является подстановочным выражением, как *; как показывает ваш эхо-пример, это итеративное расширение. Таким образом, ваш пример zgrep точно такой же, как если бы вы вводили каждую альтернативную версию в командную строку, а затем, поскольку в man2 нет man-страниц, начинающихся с zsh, происходит ошибка. (Это ошибка из-за невозможности найти совпадение, а не из-за того, что неразрывно связано с расширением последовательности скобок.)

Если вы сделали это, с другой стороны:

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

вы получите ожидаемые результаты, потому что [1-9] - это нормальное подстановочное выражение.

7 голосов
/ 10 августа 2014

В zsh, если вы хотите использовать диапазоны в именах файлов, zle предлагает <1-n> для любых реальных имен, которые могут расширяться. То есть:

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

А затем нажмите <Tab> сразу после финального b, и у вас останется print a0b a1b a5b a7b в строке.

Для всех других целей и задач - возможно, для полного диапазона требований, использования не в файлах и в сценариях - я бы выразил это, используя довольно краткий идиоматический цикл zsh:

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

Позволит вам обрабатывать весь диапазон последовательностей чисел от 1 до 50 :), после чего вы сможете делать всевозможные полезные вещи, например, коллекцию файлов, которая еще не существует:

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