我曾多次使用readlink -f
和readlink -e
来解析符号链接,据我所知,它们给出的结果相同。readlink
from 的手册页man readlink
显示:
-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
选项之间的技术差异,但我无法想到我会使用这两个选项的具体情况。是否有特定的用例和情况,人们可能更喜欢使用readlink -f
和readlink -e
反之亦然?
答案1
首先,两者都将规范化包含以下内容的文件名:
将所有相对路径转换为绝对路径
将所有符号链接转换为文件系统层次结构上的实际硬链接路径
主要区别在于:
-f
将规范化可能只在最后包含不存在的文件系统部分的路径,例如目录或文件,否则退出状态为非零;另一方面,-e
只有当文件系统中存在所有组件时才会起作用,否则退出状态为非零任何尾随
/
都会被忽略-f
,-e
将尾随/
视为目录
因此,实际上:
-e
当你想确保任何路径必须存在时使用,例如你需要退出状态来执行任何进一步的逻辑操作,if
-else
精确测试当您不希望路径现在严格存在,但稍后需要完整路径时使用
-f
,例如,您想在进程运行或文件系统挂载等之后创建解析的文件。使用
-e
尾随/
来明确检查目录条目,因为-f
忽略尾随/