
今天,我注意到使用 sudo 或以 root 身分執行命令之間有一個有趣的區別。
使用 sudorm -rf /opt/nextcloud/*
不會刪除資料夾
vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud nextcloud-16.0.4
當我第一次成為root然後執行命令時,資料夾被刪除
vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~#
為什麼是這樣?使用 sudo 刪除資料夾的正確方法是什麼?
答案1
該命令sudo rm -rf /opt/nextcloud/*
由以普通使用者身分執行的 shell 解釋。 shell甚至在運行*
之前就嘗試擴展sudo
。如果由於某種原因*
無法擴展,則命令變為:
- 要麼
sudo rm -rf /opt/nextcloud/*
wheresudo
(and thenrm
) 得到/opt/nextcloud/*
字面量*
,並且不會發生進一步的擴展;這是 POSIX 行為;/opt/nextcloud/*
顯然不存在。 - 或
sudo rm -rf
在某些情況下(例如在 Bash 中nullglob
設定該選項時)。
還有其他可能性(例如failglob
在 Bash 中進行比較),但它們似乎與您的情況不匹配。
無論如何,-f
選項rm
變得相關。它的意思是
-f
不提示確認。在沒有檔案運算元或運算元不存在的情況下,不要寫入診斷訊息或修改退出狀態。 […]
(來源)
實際上,您提供了“不存在的操作數”或“無檔案操作數”,因此該命令不執行任何操作並默默地成功。
我的假設是非提升的 shell 無法擴展,/opt/nextcloud/*
因為普通用戶沒有/opt/nextcloud/
.另一種可能性是您輸入錯誤/opt/nextcloud/*
,但沒有發現這一點,因為沒有錯誤訊息。沒有錯誤訊息,因為這就是rm -f
工作原理。
sudo ls /opt/nextcloud/
不涉及外殼的擴展。該命令ls
以 root 身份運行。它ls
本身可以存取指定的目錄及其內容,因此它可以工作。
sudo su -
當你進入以 root 身分執行的 shell後。該外殼能夠擴展/opt/nextcloud/*
,因此可以rm -rf /opt/nextcloud/*
按您的預期工作。