readlink -f 和 -e 选项描述不清楚

readlink -f 和 -e 选项描述不清楚
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist

我无法理解 -f 或 -e 的作用是什么?措辞根本不清楚。规范名称基本上是最短的唯一绝对路径。但是名称的组成部分是什么意思呢?是子目录的意思吗?这里的“递归”是什么意思?我的理解是递归搜索给定规范名称的每个子目录。但对于符号链接来说它没有意义。

接下来,“-e”选项中所有组件都必须存在是什么意思?这里的组件是什么?

有人可以帮忙举一个简单的例子吗?谢谢

答案1

这里的第一个组件是指路径的元素。例子 :

/home/user/.ssh => <component1>/<component2>/<component3>

1-假设我们有这样的目录结构:

lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1

而且这里不存在的目录将是 lols/lol3 因此您可以比较每个命令的输出:

readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol

这里的输出将是相同的,因为路径的所有组件都存在。

readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>

这里的输出是不同的,因为-F它会显示结果,因为有一个组件存在于至少在路径中是哈哈-e输出将为空,因为所有路径组件必须存在

最后一个是有多个不存在的目录:

readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>

这里的输出将为空,因为如地图页面中所述: -f :除最后一个组件之外的所有组件都必须存在 => 不受尊重 -o :所有组件必须存在 => 不受尊重

2-为什么不只使用 ls -l :

假设我们创建一个名为 file1 的文件,并创建到该名为 link1 的文件的符号链接,并从 link1 创建另一个符号链接 link2 :

touch file1 : file1 
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1

那么ls -l link2输出将是: link2 -> link1 如果我们使用readlink link2输出将是: link1 ;与 ls -l 相同,但是如果我们使用readlink -f|-e link2输出将是: file1 ;所以它会指向来源文件。

那么什么时候使用阅读链接代替LS?当有嵌套时符号链接(递归读取)。当文件/目录位于不同位置时。

所以更好用阅读链接代替LS以避免错误。

答案2

这对于遵循超过一跳的路由直到最终目标的链接来说是有意义的。例如:

touch test_file

ln -s test_file test_link
ln -s non_existing_target dead_link

ln -s test_link link1
ln -s dead_link link2

在上面,link1最终通过 链接到文件test_link,因此-f-e会给出相同的结果。link2指向一个死链接,你会看到:

> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target

dead_link是表达式“除最后一个组件之外的所有组件都必须存在”中的“最后一个组件”。-f解析为不存在的目标,同时-e不给出任何输出。


请注意,man readlink建议

realpath是用于规范化功能的首选命令

对于此示例,realpath -m, ( --missing) 将为 提供相同的输出readlink -f。一般来说,realpath -e这是测试链接是否可以解析到最终现有目标文件的方法,它在此处返回预期的错误:

> realpath -e link2
realpath: link2: No such file or directory

虽然ls -l返回所有结果,并且可能对任何死链接有一些红色输出。还存在选项-L,取消引用链接并显示其目标,这是供人类阅读的,切勿用于ls决定脚本内链接的任何内容。

相关内容