我已经阅读了很多有关该 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
。
realpath
readlink -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 上。
编者注
编辑:@AnthonyGeoghegan 写道“这是指Debian 版本
realpath
。这GNU 版本realpath
行为相同readlink -f
”)编辑:@FilBot3 写道“这不起作用MacOS 高山”
答案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
选项,仍然希望将符号链接文件的内容作为路径遵循。