为什么当有匹配项时我会收到“未找到匹配项”错误?

为什么当有匹配项时我会收到“未找到匹配项”错误?
centos@ip-10-0-5-4 ~ $ sudo ls -l /var/solr/data/new_core/_default/*
zsh: no matches found: /var/solr/data/new_core/_default/*
centos@ip-10-0-5-4 ~ $ sudo ls -l /var/solr/data/new_core/_default/ 
total 4
drwxr-xr-x. 3 root root 4096 Mar 28 07:34 conf

答案1

*在调用之前由 shell展开sudo。如果您无权访问该目录,zshshell 将抱怨“未找到匹配项”。如果shellNOMATCH中未设置 shell 选项zsh,则 shell 会将模式保留为未展开状态,并ls生成“没有此类文件或目录”错误(除非*该目录中存在具有字面名称的内容)。对于NOMATCH默认情况下的 set,sudo ls甚至不会被调用。

你可以这样做:

sudo sh -c 'ls -l /var/solr/data/new_core/_default/*'

这可以防止当前 shell 展开*并使用sh您想要以 root 身份执行的命令行进行调用。

答案2

在第一种情况下:

  1. 访问权限可防止 shell(*) 扩展/var/solr/data/new_core/_default/*您的centos.

  2. /var/solr/data/new_core/_default/*然后像第一种情况一样展开命令。

  3. 中没有*文件或目录/var/solr/data/new_core/_default/,因此no match found.

在第二种情况下, ls 查找文件并列出它们。

(*) 这是Filename Expansionzsh 的扩展(参见 参考资料man zshexpn)。

文件名生成

如果一个单词包含字符“*”之一的未加引号的实例,...

该单词将替换为与模式匹配的已排序文件名列表。

就像您centos之前一样sudo,zsh 无法访问 dir (例如 file conf),因此no match found.

相关内容