ZSH 不会将“*”识别为 "all files"

ZSH doesn't identify "*" as "all files"

我在 Ubuntu 18.04 上使用 ZSH shell 环境(带有 'oh-my-zsh' 插件),我注意到它有一个问题。我认为我的 ZSH shell 有时无法将 * 识别为“所有文件”。

例如,如果我想安装前缀为 control 的所有 ROS 包,我将输入命令:sudo apt-get install ros-melodic-control* 这应该可以安装所有以 [=12= 开头的 ROS Melodic 包] 来自主要的 ROS 存储库。当我之前使用 BASH 时,这个东西起作用了。但是现在当我在 ZSH 中做同样的事情时,它给了我以下错误:zsh: no matches found: ros-melodic-control*

如果有人帮我找出确切的问题就太好了。

TIA

就是szh和bash的区别。 zsh 永远不会 运行 包含与现有文件不匹配的通配符模式的命令。 Bash 将按原样执行。

它也可能会以不同的方式失败。如果查找 return 匹配模式的任何内容,例如。一个名为 ros-melodic-control.pdf 的文件,szh 将执行 sudo apt-get install ros-melodic-control.pdf。注意:通配符总是由 shell

调查

对于主要只与文件系统交互的非 root 用户来说,认为它是偏执狂 shell。要实际执行您想要的操作,您必须使用单引号。

 sudo apt-get install 'ros-melodic-control*'

作为 apt-get 参数给出的包不是文件。它们是数据库中的名称,其中还包含它们的位置(/var 中的本地缓存、磁盘、远程服务器或 NFS 源)。因此,如果您使用通配符,则必须确保它们作为字符串传递。如果没有匹配的文件,只需使用 bash\sh\ksh 就可以不用引号。

添加引号会将封闭的文本作为字符串“按原样”传递给已执行程序的参数。因此 apt-get 将接收字符串 ros-melodic-control* 并搜索匹配它的包。没有引号 shell 将尝试扩展通配符。