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
、-c
和 du -sh /var/lib/docker/*
被传递给命令 sudo
。然后 sudo
以 root 权限启动 bash
并传递命令 -c
、du -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
然后也将与它们一起运行。
如果我 运行 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
、-c
和 du -sh /var/lib/docker/*
被传递给命令 sudo
。然后 sudo
以 root 权限启动 bash
并传递命令 -c
、du -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
然后也将与它们一起运行。