ymf*_*foi 9 directory coreutils symlink filenames
我正在尝试在类 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
Run Code Online (Sandbox Code Playgroud)
一切都很好,因为 this_is_link 是一个符号链接,我只是将它删除了。但是在尝试时:
mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link/
Run Code Online (Sandbox Code Playgroud)
它回响了 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
=> 目录删除成功,链接仍然存在。
是否有任何关于路径解析的确切行为的规范?
该POSIX /单一Unix规范指定在以斜线路径名必须引用一个目录(请参阅基本定义§4.11路径分辨率)。foo/
实际上定义为等效于foo/.
(出于路径解析目的,而不是在操作文件名时;basename
并dirname
忽略尾部斜杠)。大多数实现都尊重这一点,但也有一些例外。
这解释了 的行为rm this_is_link/
:它等效于rm this_is_link/.
,其中参数显然是一个目录。
rmdir this_is_link/
应该类似地引用目录。它不在您的机器上是 GNU coreutils 中的一个错误。OSX 在这里表现正确。