JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как научить терминал zsh понимать звёздочку ( * ) при работе с pip (python менеджер) так же как bash?

Вчера пробовал на MacOs, а сегодня на Linux Manjaro. Результат получил одинаково неудовлетворительный.

Суть в том, что (например) для установки последней версии django третьей ветки, я использую следующую команду:
pip install django==3.*
и баш прекрасно понимает, что нужно найти какая она там последняя (а на момент написания статьи это версия 3.2.12) и установить.
А вот zsh пишет следующее:
zsh: no matches found: django==3.*
ну не в жизнь не поверю, что я такой вот уникальный и никто раньше ни с чем подобным не сталкивался. А раз так, значит должно быть решение. Поискал через гугл/яндекс и не нашёл. Может здесь подскажут.

61fb8f34a8354962226170.png
  • Вопрос задан
  • 428 просмотров
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
В команде
pip install django==3.*

Никакой ни bash ни zsh не ищет вам последнюю версию джанго. Это делает сам pip
Использование wildcard символов, на самом деле может привести к неочевидной ситуации, когда

$ echo Hello* World
Hello* World
$ touch Hello1
$ echo Hello* World
Hello1 World


То есть баш, если находит что-то по маске, подставляет, если не находит - не подставляет и молча отправляет в команду wildcard символы как есть.
Это приводит к неочевидным ошибкам, про которые как бы нет сообщений об ошибке, а ошибка может случиться.

В zsh этот момент учли и сделали так, чтобы если по wildcard ничего не найдено, то zsh не молчит, а выдает ошибку. И следовательно в команду не уйдет неэкранированный wildcard.
Сделано специально, чтобы пользователь не тупил а экранировал wildcard символы, и не стеснялся пользоваться кавычками и бэкслешом.

Следовательно, если это у тебя не файловые wildcard символы, а аргумент для команды pip - экранируй, бери в кавычки, и переделай свою привычку "мне это неудобно" в "это правильно".

Простой способ это
noglob pip install django==3.*
Или даже
alias pip="noglob pip"

P.S. Можно отключить это глобально через "setopt NOMATCH" или вроде "setopt nonomatch"
P.P.S. да, это элементарные вещи, которым ты просишь не учить, но это именно тот случай, когда ты неправ, потому что путаешь wildcard шелла и опции команды, которая внутри тоже поддерживает символы типа ? и *
Ответ написан
@q2digger
никого не трогаю, починяю примус
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы