Caractère générique Apt-get * avec ZSH

15

ZSH:

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

Fonctionne sur Bash. Quel est le problème ? :-RÉ

mirandalol
la source

Réponses:

13

Oui, zshet bashagissons différemment à cet égard.

Dans zsh, lorsque vous dites " ubuntuone-*" il recherche dans votre répertoire de travail actuel les fichiers commençant par ubuntuone-- puisqu'il n'en trouve aucun, il indique " no matches" et n'exécute pas la commande.

bashadopte une approche différente - il recherche également les fichiers qui commencent par ubuntuone-dans le répertoire de travail actuel, mais s'il n'en trouve aucun, il se dit: "Peut-être que le programme que j'invoque sait comment gérer le caractère générique", et passe donc " ubuntuone-*"off sudo apt-getcomme argument littéral.

Si vous aviez un fichier dans votre répertoire de travail actuel appelé ubuntuone-ffdjhjer, bash essaierait de s'exécuter sudo apt-get remove --purge ubuntuone-ffdjhjer, ce qui échouerait probablement.

Dans zsh(et dans bash), vous pouvez utiliser des guillemets simples pour lui dire de ne pas développer le caractère générique mais de le transmettre, comme dans:

sudo apt-get remove --purge 'ubuntuone-*'
David Purdue
la source
2
Puis-je faire en sorte que zsh se comporte comme Bash de cette manière?
mirandalol
Je ne sais pas, mais le peu de recherches que j'ai faites jusqu'à présent suggère que non. Dans tous les cas, il est toujours préférable (même en bash) d'encapsuler des arguments entre guillemets simples si vous ne voulez pas que le shell développe les caractères génériques, car même en bash la commande ne fera pas ce que vous voulez si un fichier dans le CWD correspond au caractère générique. Par exemple, je tape toujours dpkg -l 'linux*'bash pour voir tous les noyaux installés.
David Purdue
10

Peut-être un peu tard cette réponse, mais il existe un moyen de résoudre ce problème. Depuis la ligne de commande, exécutez:

unsetopt no_match
Tanel Tammik
la source
cela fonctionne très bien
neaumusic
Ou shopt -s failglobdans bashla solution bash de sorte qu'il se comporte comme zshet d' autres coquilles modernes comme fishou tcsh qui ont fixé que disfonctionnement de la Bourne shell dans lequel une commande peut encore être exécuté même si les petites boules ne correspondent pas.
Stéphane Chazelas
@ StéphaneChazelas yoda
OpenCoderX
1

Il existe un autre moyen d'empêcher l'expansion dans zsh, que je préfère aux guillemets:

sudo apt-get remove --purge ubuntuone-\*
dlussky
la source