目录符号链接上的尾部斜杠

目录符号链接上的尾部斜杠

我正在尝试在类 UNIX 系统中模拟路径解析过程(请参阅手册页 path_resolution)。

我的操作系统是带有 GNU coreutils 8.7 的 Linux。

为了澄清分辨率中额外尾随“/”的含义,我在 shell 中做了以下操作:

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link

一切都很好,因为 this_is_link 是一个符号链接,我刚刚将其删除。但在尝试时:

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link/

它回响了rm: cannot remove 'this_is_link/': Is a directory

好吧,我想,尾随的“/”导致了符号链接的跟随。所以,我尝试了另一个命令:rmdir this_is_link/

一个有趣的结果出来了:rmdir: failed to remove 'this_is_link/': Not a directory

不是我所期望的。于是我请朋友确认在他的系统上是否也能得到同样的结果。他的 coreutils 版本比我低。而结果却是惊人的,无论rm或,都会出现rmdir 'this_is_link/'同样的错误Not a directory

另一位朋友刚刚在他的Mac操作系统上尝试了一下,结果是:rm=> '是一个目录', rmdir=> 目录删除成功,链接保留

有相关规格吗精确的路径解析的行为?

答案1

POSIX/单一 Unix 规范指定带有尾部斜杠的路径名必须引用目录(请参阅基本定义§4.11 路径名解析)。foo/实际上定义为相当于foo/.(用于路径解析目的,而不是在操作文件名时;basenamedirname忽略尾部斜杠)。大多数实现都尊重这一点,但也有一些例外。

这解释了 的行为rm this_is_link/:它相当于rm this_is_link/.,其中参数显然是一个目录。

rmdir this_is_link/应该类似地引用目录。它不在你的机器上是 GNU coreutils 中的一个错误。 OSX 在这里表现正常。

答案2

我的看法:

  • ''rm link/'' 失败,因为 rm 查看最后一个字符,发现它是一个斜杠,给出了您看到的(不是真正正确的)诊断;
  • ''rmdir link/'' 失败了:链接不是目录,它是符号链接
  • ''rm link'' 将正确成功

顺便说一句,路径解析与此无关,它只是看起来是“rm”走捷径,而不是(正确地)在参数上调用“stat”(这就是 rmdir 正在做的事情)。

干杯。

相关内容