bash 在什么情况下文件 globbing 不起作用?

In what scenarios does file globbing not work in bash?

如果我 运行 sudo du -sh <some_directory>/* 在需要 root 访问权限的目录上,它会工作并列出 .但是我发现至少有一种情况不会发生这种情况:

sudo du -sh /var/lib/docker/*

http://tldp.org/LDP/abs/html/globbingref.html 没有提到任何预计这不会起作用的场景。有谁知道为什么这可能不起作用?它与 Docker 或 du 相关,还是完全与 globbing 有关。

评论里已经简单提到了,但是要对问题有一个像样的回答和更详细的解释:

在命令中

sudo du -sh /var/lib/docker/*

您正在执行的 globbing sudo 执行之前发生。只有 du 的调用是使用 root 权限完成的。这意味着如果目录 /var/lib/docker/ 对您作为普通用户有限制并且您无法读取它(缺少 r 权限),那么通配星号将不会计算任何内容。 bash 中的默认设置是保持不变,因此字符串保持 /var/lib/docker/*.

然后参数 du-sh/var/lib/docker/* 被传递给 sudo 然后它以 root 权限执行 du 并传递参数 -sh/var/lib/docker/*du 然后尝试查找与此名称完全相同的文件,但可能什么也找不到,因为其中没有名为 *.

的文件

实现你想要的,你也需要用 root 权限完成 globbing。为此,您需要使用 root 权限启动 shell(只有 shells 进行 globbing):

sudo bash -c 'du -sh /var/lib/docker/*'

这样,参数 bash-cdu -sh /var/lib/docker/* 被传递给命令 sudo。然后 sudo 以 root 权限启动 bash 并传递命令 -cdu -sh /var/lib/docker/*。然后 bash 理解,因为 -c 选项应该评估和执行命令 du -sh /var/lib/docker/*。然后它将命令按空格拆分为 "words"、du-sh/var/lib/docker/*。现在它对每个单词执行任何必要的全局扩展(具有 root 权限,因此允许读取目录 /var/lib/docker/ 的内容)。它会将最后一个单词替换为 /var/lib/docker/aufs/var/lib/docker/builder/var/lib/docker/buildkit 等多个单词。作为最后一步,它将调用 du-sh 以及 globbing 扩展的结果。为此,将继承 Root 权限,因此 du 然后也将与它们一起运行。