В команде
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 шелла и опции команды, которая внутри тоже поддерживает символы типа ? и *