-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
决定脚本内链接的任何内容。