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。
realpathreadlink -f与GNU 具有相同的效果readlink。区分这两个命令(或更确切地说,是各种realpath命令readlink -f)的是它们所支持的额外选项。
realpath不推荐使用GNU ;它有相反的问题:它太新了,无法在任何地方使用。Debian曾经从其软件包中省略GNUrealpathcoreutils并坚持使用自己的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的版本realpathrealpathreadlink -f。GNU 版本的行为与”相同 “)
realpath。GNU版本的realpath行为与相同readlink -f。
readlink -f在GNU之前很早就在OpenBSD中。现在所有的NetBSD,FreeBSD和OpenBSD都有readlink -f(您的链接甚至提到了它)。realpath已经在FreeBSD和IRIX中使用很长时间了(不知道它是否早于Debian中的版本)。HPUX和IRIX也有readlink,但没有-f。在realpathDebian中实验包现在是Coreutils的一个(作为一个实验,看看它是否打破的东西)。该dwwwrealpath更像readlink -e而GNU一个像readlink -f,所以它不是一个完整的脱入替换