今天我注意到使用 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
(然后rm
)/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/
不涉及 shell 扩展。该命令ls
以 root 身份运行。ls
本身可以访问指定目录及其内容,因此它可以工作。
之后,sudo su -
您进入以 root 身份运行的 shell。此 shell 能够扩展/opt/nextcloud/*
,因此可以rm -rf /opt/nextcloud/*
按预期工作。