I just encountered the following error with zsh
when trying to use logcat.
Namely, when typing:
adb logcat *:D
I get the following error in zsh
zsh: no matches found: *:D
I have to escape the *
like :
adb logcat \*:D
While using bash, I do not get the following error.
Why would it be like this?
zsh
warns you by default if you use a glob with no matches. Bash, on the other hand, passes the unexpanded glob to the app, which is a potential problem if you don't know for certain what will match (or if you make a mistake). You can tell zsh to pass the unevaluated argument like bash with setopt nonomatch
:
NOMATCH (+3) <C> <Z>
If a pattern for filename generation has no matches, print an
error, instead of leaving it unchanged in the argument list.
This also applies to file expansion of an initial `~' or `='.
Or drop the argument instead with setopt NULL_GLOB
:
NULL_GLOB (-G)
If a pattern for filename generation has no matches, delete the
pattern from the argument list instead of reporting an error.
Overrides NOMATCH.
Bash actually has the same option (setopt nullglob
), and can emulate zsh with setopt failglob
bash
does try to expand it - it's just that when it fails to match anything, it lets the *
through to the program you're calling. zsh
doesn't (at least by default).
You can make bash
act like zsh
by setting the failglob
option. Conversely, you can make zsh
work like the bash
default by turning off the NOMATCH
option.
In terms of adb
, no need to escape with backslashes. You can try
adb logcat '*:I'
Or an environment variable
export ANDROID_LOG_TAGS="*:I"
adb logcat
来源:https://stackoverflow.com/questions/20037364/why-zsh-tries-to-expand-and-bash-does-not