簡體   English   中英

在什么情況下,文件無法在bash中工作?

[英]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-cdu -sh /var/lib/docker/*傳遞給命令sudo 然后sudo以root權限啟動bash並傳遞命令-cdu -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM