Prevent zsh from trying to expand everything
Recently switched from bash, I noticed that zsh
will try to expand every command or argument that looks like it has wildcards in it. So the following lines won't work any more:
git diff master{,^^}
zsh: no matches found: master^^
scp remote:~/*.txt .
zsh: no matches found: remote:~/*.txt
The only way to make the above commands work is to quote the arguments, which is quite annoying.
Q: How do I configure zsh
to still try to expand wildcards, but if there are no matches, just pass on the argument as-is?
EDIT: Possibly related: scp with zsh : no matches found
Solution 1:
It is an intended feature of zsh. when using any shell, it is considered best practice to quote any character that is considered a meta character to the shell. ^
is a pattern used to negate a string when the option extendedglob
is set. *
is a pattern used to match zero or more characters.
You can stop it by disabling the option nomatch
. But by doing so, your unquoted patterns make your statements volatile, depending on what files may be present in the current working directory. You shouldn't do that.
Solution 2:
For scp
, see https://superuser.com/a/431568
For git
, use ~
instead of ^
.