Apt-get * подстановочный знак с ZSH

15

ЗШ:

sudo apt-get remove --purge ubuntuone-* 
ERROR: zsh: no matches found: ubuntuone-*

Работает на Bash. В чем проблема ? :-D

mirandalol
источник

Ответы:

13

Да zshи bashведут себя по-другому в этом отношении.

В zsh, когда вы говорите , « ubuntuone-*» это выглядит в текущей рабочей директории для файлов , которые начинаются с ubuntuone-- , так как не найти, он говорит : « no matches» и не выполняет команду.

bashпринимает другую тактику - он также ищет файлы, которые начинаются ubuntuone-в текущем рабочем каталоге, но если он не находит ничего, он говорит себе: «Может быть, программа, которую я вызываю, знает, как обрабатывать символы подстановки», и поэтому проходит » ubuntuone-*" sudo apt-getв качестве буквального аргумента.

Если в вашем текущем рабочем каталоге есть файл с именем ubuntuone-ffdjhjer, то bash попытается выполнить его sudo apt-get remove --purge ubuntuone-ffdjhjer, что, вероятно, приведет к сбою.

В zsh(и в bash) вы можете использовать одинарные кавычки, чтобы указывать не расширять шаблон, а передавать его, как в:

sudo apt-get remove --purge 'ubuntuone-*'
Дэвид Пердью
источник
2
Могу ли я заставить Zsh вести себя как Bash таким образом?
Мирандалол
Я не знаю, но небольшое исследование, которое я сделал до сих пор, предлагает нет. В любом случае всегда лучше (даже в bash) заключать аргументы в одинарные кавычки, если вы не хотите, чтобы оболочка расширяла символы подстановки, потому что даже в bash команда не будет делать то, что вы хотите, если файл в CWD соответствует шаблону. например, я всегда dpkg -l 'linux*'набираю bash, чтобы увидеть все установленные ядра.
Дэвид Пердью
10

Может быть, немного поздно, этот ответ, но есть способ это исправить. Из командной строки выполните:

unsetopt no_match
Танель Таммик
источник
это прекрасно работает
neaumusic
Или shopt -s failglobв , bashчтобы исправить bash так он ведет себя , как zshи другие современные снаряды любят fishили tcsh что зафиксировал , что ошибочная особенность оболочки Борна в результате чего команда все еще может быть запущена , даже если шарики не совпадает.
Стефан Шазелас
@ StéphaneChazelas
yoda
1

Есть еще один способ предотвратить расширение в zsh, который я предпочитаю над кавычками:

sudo apt-get remove --purge ubuntuone-\*
Длусский
источник