[英]In what scenarios does file globbing not work in bash?
如果我在需要root用戶訪問權限的目錄上運行sudo du -sh <some_directory>/*
,它將起作用並列出中所有目錄的總大小。 但是,我發現至少有一種情況不會發生這種情況:
sudo du -sh /var/lib/docker/*
http://tldp.org/LDP/abs/html/globbingref.html沒有提到任何無法預期的情況。 有誰知道為什么這可能行不通? 它與Docker或du
還是與全球性相關。
評論已經簡短地提到了它,但是對於這個問題有一個不錯的答案,並且有更詳細的解釋:
在命令中
sudo du -sh /var/lib/docker/*
正在執行的glob發生在執行sudo
之前 。 只有root權限才能完成du
的調用。 這意味着如果您以普通用戶的身份限制目錄/var/lib/docker/
,而您卻無法讀取它(缺少r
權限),那么星號不會評估任何內容。 bash
中的默認設置是使其保持不變,因此該字符串仍為/var/lib/docker/*
。
然后將參數du
, -sh
和/var/lib/docker/*
傳遞給sudo
,然后以root權限執行du
並傳遞參數-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
。 然后sudo
以root權限啟動bash
並傳遞命令-c
, du -sh /var/lib/docker/*
。 然后, bash
理解了-c
選項,該選項應該評估並執行命令du -sh /var/lib/docker/*
。 然后,將命令按空格-sh
為“單詞” du
, -sh
和/var/lib/docker/*
。 現在,它對每個單詞執行任何必要的全局擴展(具有root權限,因此允許讀取目錄/var/lib/docker/
)。 它將用/var/lib/docker/aufs
, /var/lib/docker/builder
, /var/lib/docker/buildkit
替換最后一個單詞。 最后一步,它將使用-sh
和globlob擴展的結果調用du
。 根權限將為此繼承,因此du
也將與它們一起運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.