如果我在需要root访问权限的目录上运行sudo du -sh <some_directory>/*
,它将起作用并列出中所有目录的总大小。但是,我发现至少有一种情况不会发生这种情况:
sudo du -sh /var/lib/docker/*
http://tldp.org/LDP/abs/html/globbingref.html没有提及任何无法预期的情况。有谁知道为什么这可能行不通?它与Docker或du
相关,还是与通配完全相关。
答案 0 :(得分:2)
评论中已经简要提到了它,但要对该问题有一个体面的答案并进行更详细的解释:
在命令中
sudo du -sh /var/lib/docker/*
您正在执行的globe发生在执行sudo
之前。只有root用户权限才能完成对du
的调用。这意味着,如果普通用户只能使用目录/var/lib/docker/
且您无法读取它(缺少r
权限),则星号不会评估任何内容。 bash
中的默认设置是保持不变,因此字符串仍为/var/lib/docker/*
。
然后将参数du
,-sh
和/var/lib/docker/*
传递到sudo
,然后以root权限执行du
并传递参数{{1 }}和-sh
。 /var/lib/docker/*
然后尝试查找具有该名称的文件,并且可能找不到任何内容,因为其中没有文件名为du
。
实现所需的目标,也需要使用root权限来完成通配。为此,您需要使用root用户权限启动一个shell(只有shell可以进行globbing):
*
通过这种方式,参数sudo bash -c 'du -sh /var/lib/docker/*'
,bash
和-c
被传递到命令du -sh /var/lib/docker/*
。然后sudo
以root权限启动sudo
,并传递命令bash
,-c
。然后du -sh /var/lib/docker/*
可以理解,因为应该使用bash
选项来评估和执行命令-c
。然后,它将命令按空格分隔为“单词” du -sh /var/lib/docker/*
,du
和-sh
。现在,它对每个单词执行任何必要的全局扩展(具有root权限,因此允许读取目录/var/lib/docker/*
的内容)。它将用/var/lib/docker/
,/var/lib/docker/aufs
,/var/lib/docker/builder
等替换最后一个单词。最后一步,它将调用/var/lib/docker/buildkit
和du
以及全局扩展的结果。根权限将为此继承,因此-sh
然后也将与它们一起运行。