Apt-get * wildcard із ZSH


15

ZSH:

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

Працює на Баша. В чому проблема ? :-D

Відповіді:


13

Так, zshі bashповодяться по-різному в цьому плані.

В zsh, коли ви говорите , « ubuntuone-*» це виглядає в поточній робочій директорії для файлів , які починаються з ubuntuone-- , так як не знайти, він говорить : « no matches» і не виконує команду.

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

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

У zsh(і в bash) ви можете використовувати окремі лапки, щоб сказати не розширювати підстановку, а передавати її, як у:

sudo apt-get remove --purge 'ubuntuone-*'

2
Чи можу я змусити zsh поводитись як Баш таким чином?
mirandalol

Я не знаю, але небагато досліджень, які я проводив до цього часу, говорить про те, що ні. У будь-якому випадку, завжди краще (навіть у bash) аргументувати аргументи в одиничних лапках, якщо ви не хочете, щоб оболонка розширювала символи, тому що навіть у bash команда не буде робити те, що ви хочете, якщо файл у CWD відповідає підстановці. Наприклад, я завжди dpkg -l 'linux*'набираю bash, щоб побачити всі встановлені ядра.
Девід Пердю

10

Можливо, трохи відповідь на цю відповідь, але є спосіб виправити це. З командного рядка виконайте:

unsetopt no_match

це чудово працює
неаумузично

Або shopt -s failglobв , bashщоб виправити bash так він поводиться , як zshі інші сучасні снаряди люблять fishабо tcsh що зафіксував , що помилкова особливість оболонки Борна в результаті чого команда все ще може бути запущена , навіть якщо кульки не збігається.
Стефан Шазелас

@ StéphaneChazelas yoda
OpenCoderX

1

Є ще один спосіб запобігти розширенню в zsh, який я віддаю перевагу над цитатами:

sudo apt-get remove --purge ubuntuone-\*
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.