指向目录的符号链接上的斜杠


8

我正在尝试在类似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 OS上进行了尝试,结果是:rm=>'是目录',rmdir=>目录已成功删除,链接仍然存在

是否有关于路径解析的确切行为的规范?


Answers:


7

POSIX /单一Unix规范指定在以斜线路径名必须引用一个目录(请参阅基本定义§4.11路径分辨率)。foo/实际上被定义为等效于foo/.(出于路径解析的目的,而不是在处理文件名时;basename并且dirname忽略结尾的斜杠)。大多数实现都尊重这一点,但是也有一些例外。

这就解释了rm this_is_link/:的行为,它等效于rm this_is_link/.,其中参数显然是目录。

rmdir this_is_link/应该类似地参考目录。它不在您的计算机上是GNU coreutils中的错误。OSX在这里行为正确。


这正是我需要的,谢谢大家!
ymfoi 2012年

-1

我的看法:

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

顺便说一句,路径解析与此无关,它只是在“ rm”开一个角,而不是(正确地)在一个参数上调用“ stat”(rmdir在做什么)。

干杯。


1
实际上,相反的rm说法似乎是正确的:确实调用stat(好吧,newfstatat,实际上是带有该AT_SYMLINK_NOFOLLOW选项)并且拒绝继续进行任何操作,而rmdir实际上调用rmdir(2),但是得到ENOTDIR
Ansgar Esztermann

@AnsgarEsztermann AT_SYMLINK_NOFOLLOW将阻止它遵循符号链接,因此rm应该删除链接本身,而不是打印与情况不匹配的“非目录”。
ymfoi 2012年

通过对stat(1)的简短检查,斜杠将覆盖该选项。的输出statstat -L当参数而不尾随斜线只给出不同。
Ansgar Esztermann,2012年

@AnsgarEsztermann哦,我明白了。对不同环境的不同影响如何?有任何想法吗?
ymfoi 2012年

1
情况恰恰相反:在ymfoi的计算机上,rm行为正确而rmdir没有。根据/POSIX标准,结尾应强制他们将其参数视为目录。请参阅我的答案以获取参考
吉尔斯(Gillles)“所以-别再作恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.