25

ZSH:

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

Works on Bash. What's the problem ? :-D

mirandalol
  • 561
  • 2
  • 7
  • 15

3 Answers3

24

Yes, zsh and bash behave differently in this regard.

In zsh, when you say "ubuntuone-*" it looks in your current working directory for files that start with ubuntuone- - since it does not find any, it says "no matches" and does not run the command.

bash takes a different tack - it also looks for files that start with ubuntuone- in the current working directory, but if it does not find any it says to itself, "Maybe the program I am invoking knows how to handle the wildcard," and so passes "ubuntuone-*" off to sudo apt-get as a literal argument.

If you had a file in your current working directory called ubuntuone-ffdjhjer, then bash would try to execute sudo apt-get remove --purge ubuntuone-ffdjhjer, which would probably fail.

In zsh (and in bash) you can use single quotes to tell it not to expand the wildcard but to pass it on, as in:

sudo apt-get remove --purge 'ubuntuone-*'
David Purdue
  • 2,457
  • 13
  • 16
  • 2
    Can I make zsh behave as Bash in that manner? – mirandalol Aug 21 '13 at 13:03
  • 1
    I don't know, but the little bit of research I have done so far suggests no. In any case, it is always better (even in bash) to encase arguments in single quotes if you don't want the shell to expand wildcards, because even in bash the command won't do what you want if a file in the CWD matches the wildcard. e.g. I always type `dpkg -l 'linux*'` in bash to see all installed kernels. – David Purdue Aug 22 '13 at 23:56
14

Might be a little late this answer, but there is a way to fix this. From command line execute:

unsetopt no_match
Jorge Castro
  • 70,934
  • 124
  • 466
  • 653
Tanel Tammik
  • 362
  • 4
  • 10
6

There are another way to prevent expansion in zsh, which i prefer over quotes:

sudo apt-get remove --purge ubuntuone-\*
dlussky
  • 61
  • 1
  • 1