在什么情况下,文件无法在bash中工作?

时间:2018-09-07 20:50:33

标签: bash unix glob du

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

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

http://tldp.org/LDP/abs/html/globbingref.html没有提及任何无法预期的情况。有谁知道为什么这可能行不通?它与Docker或du相关,还是与通配完全相关。

1 个答案:

答案 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/buildkitdu以及全局扩展的结果。根权限将为此继承,因此-sh然后也将与它们一起运行。