Answers:
realpath
周围有几个命令。
该realpath
实用程序是围绕着一个包装realpath
库函数,并已改造很多次。
Debian的用于维持realpath
包(分离自dwww
自木本尚未除自2001年以来就包装和文档改变),但现在已经逐步淘汰。之所以不推荐使用该实用程序,是因为现在有更多的标准替代方法(GNU readlink
和即将推出的GNU realpath
),但是在那时,GNU实用程序甚至根本没有readlink
。该实现realpath
支持一些options
防止符号链接解析或产生以空值结尾的输出。
BusyBox还包括其自己的realpath
命令(不带任何选项)。
GNU coreutils于2012年1月realpath
在版本8.15中引入了一个命令。它是BusyBox和Debian的兼容替代品realpath
,并且具有与GNU相同的许多选项readlink
。
realpath
readlink -f
与GNU 具有相同的效果readlink
。区分这两个命令(或更确切地说,是各种realpath
命令readlink -f
)的是它们所支持的额外选项。
realpath
不推荐使用GNU ;它有相反的问题:它太新了,无法在任何地方使用。Debian曾经从其软件包中省略GNUrealpath
coreutils
并坚持使用自己的realpath
。我不知道为什么,因为GNU realpath
应该可以直接替换。从Debian jessie和Ubuntu 16.04开始,realpath
使用了GNU 。
目前,在Linux系统上,规范化可能包含符号链接的路径的最佳选择是readlink -f
。
BSD系统具有一个readlink
命令,其功能与GNU不同readlink
。特别是,BSD readlink
没有选择规范化路径的选项,它仅遍历传递给它的符号链接。
readlink
顺便说一句,它也有同样的问题-它也被发明了很多次(在将符号链接添加到Unix时不添加此实用程序是令人遗憾的遗漏)。现在,它在具有许多不兼容标志(尤其是BSD与GNU)的几种实现中已稳定下来。
realpath
自2002年以来在此之前一直在FreeBSD下,pwd
是这样做(自2000年起,pwd some-file
将调用realpath()
上file
)。Debian的已经有一realpath
包1996年以来IRIX的一个可能早于它,虽然我没有发现任何其他证据比它在IRIX 6.5在1998年的OpenBSD增加了-f
到readlink
1997年。GNU readlink
在2003年添加,并且-f
从一开始就添加了。
realpath
。有谁知道它是否与readlink -f
版本有所不同?
tl; dr readlink -f
将返回0
现有目录中不存在的文件,而realpath
返回1
。但是,其readlink -e
行为类似于realpath
并返回1
不存在的文件(请参阅最后的编辑器注释)。
readlink -f
$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0
readlink -e
$ readlink -e non-existent-file
$ echo $?
1
realpath
$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1
readlink -f
目录不存在readlink -f
行为的变化取决于路径的哪一部分不存在。
$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1
readlink
已安装在大多数Linux发行版中。而realpath
通常必须明确安装。
如果要替换调用,请realpath ...
使用readlink -e ...
。
在Ubuntu 16上使用readlink(GNU coreutils)8.21和realpath版本1.19进行了测试。
(编辑: @ AnthonyGeoghegan写道“ 这是指Debian的版本realpath
realpath
readlink -f
。GNU 版本的行为与”相同 “)
realpath
。GNU版本的realpath
行为与相同readlink -f
。
readlink -f
在GNU之前很早就在OpenBSD中。现在所有的NetBSD,FreeBSD和OpenBSD都有readlink -f
(您的链接甚至提到了它)。realpath
已经在FreeBSD和IRIX中使用很长时间了(不知道它是否早于Debian中的版本)。HPUX和IRIX也有readlink
,但没有-f
。在realpath
Debian中实验包现在是Coreutils的一个(作为一个实验,看看它是否打破的东西)。该dwwwrealpath
更像readlink -e
而GNU一个像readlink -f
,所以它不是一个完整的脱入替换