为什么zsh试图扩展*和bash不?

时间:2013-11-17 23:02:12

标签: bash adb zsh glob expansion

我在尝试使用logcat时遇到了zsh的以下错误 即,输入时:

adb logcat *:D 

我在zsh中收到以下错误

zsh: no matches found: *:D

我必须像*一样逃避:

adb logcat \*:D 

使用bash时,我没有收到以下错误 为什么会这样?

3 个答案:

答案 0 :(得分:10)

如果你使用没有匹配的glob,

zsh会默认警告你。另一方面,Bash将未展开的glob传递给app,如果您不确定哪些匹配(或者如果您犯了错误),则这是一个潜在的问题。您可以告诉zsh传递未评估的参数,例如使用setopt nonomatch的bash:

   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 `='.

或者使用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实际上具有相同的选项(setopt nullglob),可以使用setopt failglob模拟zsh

答案 1 :(得分:2)

bash会尝试扩展它 - 只是当它无法匹配任何内容时,它会让*通过您正在调用的程序。 zsh没有(至少默认情况下)。

您可以通过设置bash选项使zshfailglob一样行事。相反,您可以通过关闭zsh选项使bash像默认NOMATCH一样工作。

答案 2 :(得分:1)

adb而言,无需使用反斜杠进行转义。你可以尝试

adb logcat '*:I'

或环境变量

export ANDROID_LOG_TAGS="*:I"
adb logcat