Apt-get * wildcard dengan ZSH

15

ZSH:

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

Bekerja di Bash. Apa masalahnya ? :-D

mirandalol
sumber

Jawaban:

13

Ya, zshdan bashberperilaku berbeda dalam hal ini.

Di zsh, ketika Anda mengatakan " ubuntuone-*" itu terlihat di direktori kerja Anda saat ini untuk file yang dimulai dengan ubuntuone-- karena tidak menemukan apa pun, ia mengatakan " no matches" dan tidak menjalankan perintah.

bashmengambil taktik yang berbeda - ia juga mencari file yang dimulai dengan ubuntuone-di direktori kerja saat ini, tetapi jika tidak menemukan itu mengatakan kepada dirinya sendiri, "Mungkin program saya memohon tahu bagaimana menangani wildcard," dan seterusnya " ubuntuone-*"ke sudo apt-getsebagai argumen literal.

Jika Anda memiliki file di direktori kerja Anda saat ini bernama ubuntuone-ffdjhjer, maka bash akan mencoba mengeksekusi sudo apt-get remove --purge ubuntuone-ffdjhjer, yang mungkin akan gagal.

Di zsh(dan di bash) Anda dapat menggunakan tanda kutip tunggal untuk mengatakan itu bukan untuk memperluas wildcard tetapi untuk meneruskannya, seperti pada:

sudo apt-get remove --purge 'ubuntuone-*'
David Purdue
sumber
2
Bisakah saya membuat zsh bersikap seperti Bash dengan cara itu?
mirandalol
Saya tidak tahu, tapi sedikit penelitian yang saya lakukan sejauh ini menunjukkan tidak. Bagaimanapun, selalu lebih baik (bahkan dalam bash) untuk membungkus argumen dalam tanda kutip tunggal jika Anda tidak ingin shell untuk memperluas wildcard, karena bahkan dalam bash perintah tidak akan melakukan apa yang Anda inginkan jika file dalam CWD cocok dengan wildcard. misal saya selalu mengetikkan dpkg -l 'linux*'bash untuk melihat semua kernel yang terinstal.
David Purdue
10

Mungkin agak terlambat jawaban ini, tetapi ada cara untuk memperbaikinya. Dari baris perintah jalankan:

unsetopt no_match
Tanel Tammik
sumber
ini sangat bagus
neaumusic
Atau shopt -s failglobdi bashuntuk memperbaiki bash sehingga berperilaku seperti zshdan kerang modern lainnya seperti fishatau tcsh yang telah tetap bahwa misfeature dari Bourne shell dimana perintah mungkin masih berjalan bahkan jika gumpalan tidak cocok.
Stéphane Chazelas
@ StéphaneChazelas yoda
OpenCoderX
1

Ada cara lain untuk mencegah ekspansi di zsh, yang saya sukai daripada kutipan:

sudo apt-get remove --purge ubuntuone-\*
Astaga
sumber