rmdir(1) 和 rm(1) 共存的原因是什么?

How*_*ard 18 linux unix bsd

我每天都使用 BSD 和 Linux,我从来没有遇到过必须使用 rmdir(1) 而不是 rm(1) 的情况。rmdir 存在的目的是什么?

Jon*_*ler 27

主要原因可能是历史原因。回到过去,没有rmdir(2)mkdir(2)系统调用(我们在这里讨论第 7 版 UNIX™),并且rmdir(1)是(必然)使用unlink(2)系统调用删除目录的 SUID 根程序。

第 7 版 UNIX 手册可在http://cm.bell-labs.com/7thEdMan在线获取(最后检查时间为 2017-04-23);它们也可以在http://plan9.bell-labs.com/7thEdMan(最后一次检查 2017-04-23)上找到。对于第 2 卷中的文章,似乎也至少有一个在线替代来源 — http://wolfram.schneider.org/bsd/7thEdManVol2/,其中包含指向第 1 卷中命令和系统调用的FreeBSD站点的链接.

rm命令(一个常规的非 SUID 程序)调用了rmdir(1)删除空目录的命令。它自己做不到;这需要root权限。因此,存在删除空目录的rmdir(1)命令(请参阅此处了解其在 Unix V7 中的源代码),并且该rm命令本身并没有删除空目录。

要用于rm删除目录,您必须提供-r选项。

还有一个对称性论证。您需要一个命令mkdir(1)来创建目录;有一个命令rmdir(1)来撤销mkdir(1)所做的事情似乎是合理的。此外,它们(现在)是 thermdir(2)mkdir(2)系统调用的简单执行器——是的,在第 7 版 UNIX 中,mkdir(1)它也是一个 SUID 根程序,使用mknod(2)调用创建目录节点并link(2)调用在目录中创建...条目.

  • mknod + 链接和取消链接系统的一个主要缺点是创建目录不是原子操作,因此您最终可能会得到一个部分完整的目录。设计了许多程序来检查文件系统是否存在不一致;`fsck(1)` 是幸存下来的那个。 (4认同)
  • 好的。我刚刚检查了我这里的 3BSD 副本,那里也没有 rmdir 系统调用的文档,并且 rmdir(1) 仍然使用 unlink 实现。 (2认同)

And*_*oss 6

“rm”不适用于目录。您必须使用 rmdir 或指定 -r 开关以进行递归删除。原因是历史的:unlinkrmdir是独立的系统调用,并已经从Unix的初期阶段。

  • 一个令人愉快的副作用是,当您打算只删除一个文件时,意外删除目录的可能性略低。 (4认同)
  • 实际上,在 Unix 的早期,`rmdir(2)` 和 `mkdir(2)` 都不作为系统调用存在;用户 `root` 可以使用 `mknod(2)` 调用来创建目录节点,并使用 `link(2)` 调用在目录中创建 `.` 和 `..` 条目;并且 `root` 可以使用 `unlink(2)` 调用来删除目录条目。 (2认同)