“ realpath”和“ readlink -f”之间有什么区别


68

我已经阅读了很多有关realpath命令的信息readlink -f,现在推荐使用它已被弃用。我在某些地方还看到,引入realpath的原因是由于readlink中缺少这种功能,并且一旦引入了Realpath,就不再需要realpath了,大多数操作系统供应商都停止了对Realpath的支持。

我提出这个问题的原因是,我还看到许多人建议将它readlink -f作为与“非常相似”的命令realpath,这让我感到困扰,因为没有人详细介绍这一“非常相似”的部分。实际区别是什么?

Answers:


73

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)的几种实现中已稳定下来。


8
readlink -f在GNU之前很早就在OpenBSD中。现在所有的NetBSD,FreeBSD和OpenBSD都有readlink -f(您的链接甚至提到了它)。realpath已经在FreeBSD和IRIX中使用很长时间了(不知道它是否早于Debian中的版本)。HPUX和IRIX也有readlink,但没有-f。在realpathDebian中实验包现在是Coreutils的一个(作为一个实验,看看它是否打破的东西)。该dwww realpath更像readlink -e而GNU一个像readlink -f,所以它不是一个完整的脱入替换
斯特凡Chazelas

2
realpath自2002年以来在此之前一直在FreeBSD下,pwd是这样做(自2000年起,pwd some-file将调用realpath()file)。Debian的已经有一realpath包1996年以来IRIX的一个可能早于它,虽然我没有发现任何其他证据比它在IRIX 6.5在1998年的OpenBSD增加了-freadlink 1997年GNU readlink在2003年添加,并且-f从一开始就添加了。
斯特凡Chazelas

2
优秀的摘要,谢谢。注意Debian的请求切换到GNU变种更好的bug是bugs.debian.org/730779即使是现有的真实路径维护者想切换到发生
哈灵顿布雷迪

1
很棒的答案。仅丢失了有关RHEL实现的参考realpath。有谁知道它是否与readlink -f版本有所不同?
FelipeLeão2014年

1
@StéphaneChazelas噢,我的答案中确实有很多错误。感谢您指出。您能提供正确答案,我将删除我的答案吗?(否则,我将纠正错误,但要继续执行我的待办事项清单
Gilles 2014年

17

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.21realpath版本1.19进行了测试。

编辑: @ AnthonyGeoghegan写道“ 这是指Debian的版本realpathrealpathreadlink -f。GNU 版本的行为与”相同 “)


3
我赞成这个答案,但建议您澄清一下,它指的是Debian版本realpath。GNU版本的realpath行为与相同readlink -f
Anthony Geoghegan

2
可以确认这在MacOS High Sierra上不起作用。
强的松
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.