Почему я получаю эту ошибку, используя {1..9} в zsh?

StackOverflow https://stackoverflow.com/questions/805361

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

В 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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top