Curinga Apt-get * com ZSH

15

ZSH:

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

Funciona no Bash. Qual é o problema ? :-D

mirandalol
fonte

Respostas:

13

Sim, zshe bashse comporta de maneira diferente a esse respeito.

Em zsh, quando você diz " ubuntuone-*" parece no seu diretório de trabalho atual para os arquivos que começam com ubuntuone-- uma vez que não encontrar nenhum, ele diz que " no matches" e não executar o comando.

bashadota uma abordagem diferente - ele também procura por arquivos que iniciam ubuntuone-no diretório de trabalho atual, mas, se não encontrar nenhum, diz para si mesmo: "Talvez o programa que estou invocando saiba como lidar com o curinga" e assim passe " ubuntuone-*" sudo apt-getcomo um argumento literal.

Se você tivesse um arquivo em seu diretório de trabalho atual chamado ubuntuone-ffdjhjer, o bash tentaria executar sudo apt-get remove --purge ubuntuone-ffdjhjer, o que provavelmente falharia.

Em zsh(e em bash), você pode usar aspas simples para dizer para não expandir o curinga, mas para transmiti-lo, como em:

sudo apt-get remove --purge 'ubuntuone-*'
David Purdue
fonte
2
Posso fazer o zsh se comportar como Bash dessa maneira?
mirandalol
Não sei, mas o pouco de pesquisa que fiz até agora sugere que não. De qualquer forma, é sempre melhor (mesmo no bash) incluir argumentos entre aspas simples se você não quiser que o shell expanda curingas, porque mesmo no bash o comando não fará o que você deseja se um arquivo no CWD corresponde ao curinga. Por exemplo, eu sempre digito dpkg -l 'linux*'bash para ver todos os kernels instalados.
David Purdue
10

Pode ser um pouco tarde para esta resposta, mas há uma maneira de corrigir isso. Na linha de comando, execute:

unsetopt no_match
Tanel Tammik
fonte
isso funciona muito bem
neaumusic
Ou na correção para que ele se comporta como e outros shells modernos gostam ou que fixaram que misfeature do shell Bourne pelo qual um comando ainda pode ser executado mesmo se as bolhas não se encontraram. shopt -s failglobbash bashzshfishtcsh
Stéphane Chazelas
@ StéphaneChazelas yoda
OpenCoderX
1

Há outra maneira de impedir a expansão no zsh, que eu prefiro sobre aspas:

sudo apt-get remove --purge ubuntuone-\*
dlussky
fonte