为什么在 zsh 上使用 '*' 总是不起作用?

ban*_*run 4 command-line bash zsh

我在 zsh 上运行了以下命令

sudo apt-get install rhythmbox* 
Run Code Online (Sandbox Code Playgroud)

它产生了一个错误,当我在 bash 中运行相同的命令时它起作用了。为什么会发生这种情况?

如何使上述命令在 zsh 上工作?

ger*_*ijk 9

这是发生了什么

Bash 将尝试评估rhythmbox*当前工作目录上的模式。由于不太可能有任何以 的序列开头的文件或目录rhythmbox,因此它不会扩展,但 Bash 会将其作为参数提供给apt-get此处。

请注意,如果您在那里有一个带有名称的文件,rhythmbox-test那么它将无法工作,因为它将被扩展并rhythmbox-test作为参数提供给apt-get.

解决方案:转义或引用它!

所以,为了apt-get在 Bash shell 中可靠地使用模式,你应该总是逃避它。使用引号或反斜杠,例如

sudo apt-get install rhythmbox\* 
Run Code Online (Sandbox Code Playgroud)

或者

sudo apt-get install "rhythmbox*"
Run Code Online (Sandbox Code Playgroud)

zsh 也差不多。

模式的扩展称为globbing

演示

touch aa ab  # creates files aa and ab
ls a*        # lists both files as Bash provided ls two arguments.
ls 'a*'      # No such file or directory. Bash provided literally a* to ls.
ls a\*       # No such file or directory. Same as above.
Run Code Online (Sandbox Code Playgroud)