1

zsh, похоже, не может развернуть регулярное выражение apt-get . Например, я хотел бы установить все пакеты, которые имеют префикс llvm-3.1 , и я использую:

sudo apt-get install llvm-3.1*

Но Zsh говорит мне, что:

zsh: no matches found: llvm-3.1*

zsh хорошо расширяет другие regrex (ls * всегда перечисляет all скрытые файлы в текущем каталоге).

Я также попробовал bash или даже sh(что на самом деле является dash), и они оба работают правильно.

Так что мне нужно установить некоторые дополнительные параметры, чтобы заставить zsh работать на apt-get? Заранее спасибо.

1 ответ1

3

Эти шаблоны не являются регулярными выражениями, их обычно называют шаблонами глобуса. И ни в коем случае оболочка не будет правильно расширять шаблоны глобусов для имен пакетов, которые будут использоваться с apt-get. Оболочки будут только расширять шаблоны глобусов на основе файлов, которые присутствуют в вашей локальной файловой системе.

Другие оболочки, которые вы использовали, также не расширяют этот шаблон, но вместо сообщения об ошибке они передают аргумент в виде apt-get, который затем может сопоставить сам шаблон и сделать это с именами доступных пакетов. , Вы можете получить это поведение из zsh, используя:

unsetopt no_match

Но было бы лучше привыкнуть к цитированию специальных символов, таких как * если вы не хотите, чтобы эти шаблоны расширялись оболочкой. Если при выполнении этой команды у вас был файл, соответствующий этому шаблону, в текущем каталоге, то любая из этих оболочек расширит шаблон до соответствия этому файлу перед запуском apt-get, это вряд ли даст ожидаемые результаты.

Любое из следующего будет работать в любой из этих оболочек, даже если у вас есть файлы, которые соответствуют шаблону:

sudo apt-get install llvm-3.1\*
sudo apt-get install 'llvm-3.1*'
sudo apt-get install "llvm-3.1*"

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .