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

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

我已经阅读了很多有关该 realpath命令以及它如何被弃用而readlink -f现在被推荐的内容。我也在一些地方看到,之所以引入realpath,是因为readlink中缺乏这样的功能,并且一旦引入,realpath就不再需要,并且大多数操作系统供应商都停止了对它的支持。

我提出问题的原因是,我也看到很多人推荐readlink -f作为“非常相似”的命令realpath,这就是困扰我的原因,因为没有人详细说明“非常相似”的部分。实际差异是什么?

答案1

周围有几个realpath命令。

realpath实用程序是一个包装器realpath库函数并被重新发明了许多

Debian 曾经维护过一个realpath包裹 (分开dwww自从木质的)自 2001 年以来,除了包装和文档之外,其他方面没有任何变化,但现已逐步淘汰。该实用程序已被弃用,因为现在有更多标准替代品(GNUreadlink以及很快的 GNU realpath),但当时 GNU 实用程序甚至readlink根本没有。这个实现realpath支持一些options以防止符号链接解析或产生空终止输出。 忙碌盒还包括自己的realpath命令(不带任何选项)。

GNU 核心工具介绍了一个realpath命令输入8.15版本2012 年 1 月。这是 BusyBox 和 Debian 的兼容替代品realpath,并且还有许多与 GNU 相同的选项readlink

realpathreadlink -f与 GNU具有相同的效果readlink。这两个命令(或者更确切地说是realpath来自 的各种命令readlink -f)的区别在于它们支持的额外选项。

GNUrealpath并未被弃用;它有相反的问题:它太新了,不能随处可用。 Debian 曾经省略 GNUrealpath从它的coreutils包装并坚持自己的realpath。我不知道为什么,因为 GNUrealpath应该是一个直接的替代品。然而,从 Debian jessie 和 Ubuntu 16.04 开始,realpath使用 GNU。

目前,在 Linux 系统上,规范化可能包含符号链接的路径的最佳选择是readlink -f.

BSD 系统有一个readlink命令,具有与 GNU 不同的功能readlink。特别是,BSDreadlink没有规范化路径的选项,它仅遍历传递给它的符号链接。

readlink顺便说一句,也有同样的问题——它也是发明多次(当符号链接被添加到 Unix 时没有添加这个实用程序是一个令人遗憾的遗漏)。它现在已经在多个具有许多不兼容标志的实现中稳定下来(特别是 BSD 与 GNU)。

答案2

太长了;博士 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

realpath目录不存在

$ realpath /tmp/non-existent-dir/foo
$ echo $?
1

可用性

readlink已安装在大多数 Linux 发行版中。鉴于,realpath也变得越来越常见,已经安装为realpath已被卷入GNU Coreutils(在前几年,它是它自己的单独的包)。

总之

如果您想替换调用,realpath ...则使用readlink -e ....
然而,它的分布正变得越来越广泛,因此期望被安装realpath并不是没有道理的。realpath

MMV readlink实施差异很大。
MMV realpath默认 Linux 安装中的可用性比readlink.


测试用readlink(GNU coreutils)8.21真实路径版本 1.19在 Ubuntu 16 上。


编者注

答案3

readlink -f正如其他响应中所述,或的功能readlink -e(取决于发行版)可以等同于 的功能realpath。然而,realpath该实用程序并不等同于readlink.例如,readlink可以读取/检索符号链接文件(其中的文字文本)的内容:

> ln -s "I am cold" slfile
> readlink slfile
I am cold

这是realpath做不到的。

毕竟,符号链接文件是解释为在目录/文件层次结构中移动的“配方”的文本文件。但它仍然是一个文本文件。例如,它的内容(readlink返回的内容)应该可以被操纵sed -i '...' slfile——事实上,选项--follow-symlinks是强制sed -i遵循符号链接。我写“应该”是因为在我当前的设置(OpenSuSe 15.3 默认、GNU sed 4.4、GNU bash 版本 4.4.23(1))中,此功能会出现故障:sed -i如果没有该--follow-symlinks选项,仍然希望将符号链接文件的内容作为路径遵循。

相关内容