Apt-get * wildcard with ZSH

15

ZSH:

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

Działa na Bash. Jaki jest problem ? :-RE

mirandalol
źródło

Odpowiedzi:

13

Tak, zsh i bashzachowuj się inaczej w tym zakresie.

W zsh, kiedy mówisz „ ubuntuone-*” wygląda w bieżącym katalogu roboczym dla plików, które zaczynają sięubuntuone- - ponieważ nie znajdziesz, to mówi „ no matches” i nie uruchomić komendę.

bashma inną przyczepność - szuka również plików, które zaczynają się ubuntuone-w bieżącym katalogu roboczym, ale jeśli go nie znajdzie, mówi do siebie: „Może program, który wywołuję, wie, jak obsługiwać znak wieloznaczny”, a więc przekazuje ” ubuntuone-*sudo apt-getjako dosłowny argument.

Jeśli masz plik w bieżącym katalogu roboczym o nazwie ubuntuone-ffdjhjer, bash spróbuje wykonać sudo apt-get remove --purge ubuntuone-ffdjhjer, co prawdopodobnie się nie powiedzie.

W zsh(i w bash) możesz użyć pojedynczych cudzysłowów, aby powiedzieć mu, aby nie rozwijał symbolu wieloznacznego, ale przekazał go, jak w:

sudo apt-get remove --purge 'ubuntuone-*'
David Purdue
źródło
2
Czy mogę sprawić, aby Zsh zachowywał się jak Bash w ten sposób?
mirandalol,
Nie wiem, ale trochę badań, które do tej pory przeprowadziłem, sugeruje, że nie. W każdym razie zawsze lepiej (nawet w bash) wstawiać argumenty w pojedyncze cudzysłowy, jeśli nie chcesz, aby powłoka rozwijała symbole wieloznaczne, ponieważ nawet w bash polecenie nie zrobi tego, co chcesz, jeśli plik w CWD pasuje do znaku wieloznacznego. np. zawsze piszę dpkg -l 'linux*'bash, aby zobaczyć wszystkie zainstalowane jądra.
David Purdue
10

Być może trochę spóźni się ta odpowiedź, ale istnieje sposób, aby to naprawić. Z wiersza poleceń wykonaj:

unsetopt no_match
Tanel Tammik
źródło
to działa świetnie
neaumusic
Lub shopt -s failglobw bashcelu poprawki bash , dlatego zachowuje się jak zshi inne nowoczesne pociski podoba fishlub tcsh które zostały ustalone, że misfeature z Bourne shell czym komenda może nadal działać, nawet jeśli globs nie pasuje.
Stéphane Chazelas,
@ StéphaneChazelas yoda
OpenCoderX
1

Istnieje inny sposób zapobiegania ekspansji w Zsh, który wolę niż cytaty:

sudo apt-get remove --purge ubuntuone-\*
dlussky
źródło