Почему я получаю эту ошибку, используя {1..9} в zsh?
Вопрос
Я запускаю следующий код
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]