Shell ZSH不';t识别“*&引用;作为「;“所有文件”;

Shell ZSH不';t识别“*&引用;作为「;“所有文件”;,shell,zsh,ubuntu-18.04,ros,oh-my-zsh,Shell,Zsh,Ubuntu 18.04,Ros,Oh My Zsh,我在我的Ubuntu18.04上使用了ZSH shell环境(带有“哦,我的ZSH”插件),我注意到了它的一个问题。我认为我的ZSH shell有时不会将*标识为“所有文件” 例如,如果我想安装前缀为control的所有ROS软件包,我会输入命令:sudo apt get install ROS-melodic-control*,这应该可以工作,并从主ROS存储库安装所有以control开始的ROS-melodic软件包。当我早些时候使用BASH时,这个东西就起作用了。但是现在,当我在ZSH中做

我在我的Ubuntu18.04上使用了ZSH shell环境(带有“哦,我的ZSH”插件),我注意到了它的一个问题。我认为我的ZSH shell有时不会将
*
标识为“所有文件”

例如,如果我想安装前缀为
control
的所有ROS软件包,我会输入命令:
sudo apt get install ROS-melodic-control*
,这应该可以工作,并从主ROS存储库安装所有以
control
开始的ROS-melodic软件包。当我早些时候使用BASH时,这个东西就起作用了。但是现在,当我在ZSH中做同样的事情时,它会给我以下错误:
ZSH:没有找到匹配项:ros旋律控制*

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


TIA

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

它也可能以不同的方式失败。如果查找将返回与模式匹配的任何内容,例如名为
ros-melodic-control.pdf
,szh将执行
sudo-apt-get-install-ros-melodic-control.pdf
。注:通配符总是由shell进行研究

对于主要只与文件系统交互的非root用户来说,这是一个偏执的外壳。要真正做到你想要的,你必须使用单引号

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


添加引号将以字符串的形式将封闭文本“原样”传递给已执行程序的参数。因此,apt get将接收字符串
ros melodic control*
,并搜索与之匹配的包。如果没有引号,shell将尝试扩展通配符。

谢谢!!!添加单引号非常有效!但是我不明白原因。您能更清楚地解释一下吗?@adbidwai作为apt-get参数提供的包不是文件。它们是数据库中的名称,数据库中还包含它们的位置(在/var中的本地缓存、磁盘、远程服务器或NFS源)。因此,如果使用通配符,必须确保它们作为字符串传递。只要使用bash\sh\ksh,如果没有匹配的文件,就可以不使用引号。