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

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-*'

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

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-\*
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.