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
-m, --canonicalize-missing
canonicalize by following every symlink in every component of
the given name recursively, without requirements on components
existence
答案1
我认为这是不言自明的,所以我真的不知道对你来说听起来模棱两可的部分......让我们看一个例子:
--规范化
$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp
$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir
$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt
无论选项是什么,readlink
都会: - 将相对路径转换为绝对路径 - 将符号链接名称转换为真实路径
正如您在上面所看到的, with -f
,readlink
并不关心该路径的最后一部分(此处nonexistentfile.txt
)是否存在。
如果该路径的另一部分不存在,readlink
则不会输出任何内容,并且返回代码不同于 0(这意味着发生了错误)。看:
$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1
--规范化现有的
如果您尝试同样的操作-e
:
$ readlink -e ./subdir/link
/tmp/realdir
$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1
使用 时-e
,如果任何路径组件不存在,readlink
则不会输出任何内容,并且返回代码将不同于 0。
--规范化缺失
-m
选项与 相反-e
。不会进行测试来检查路径的组成部分是否存在:
$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile
$ ln -s /nonexistent /tmp/subdir/brokenlink
$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar
答案2
让我困惑的是为什么有人需要 -e 和 -m 选项?
从内核源代码./scripts/kconfig/merge_config.sh(该脚本获取配置片段值列表,并将它们一一合并):
if [ -z "$KCONFIG_CONFIG" ]; then
if [ "$OUTPUT" != . ]; then
KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
else
KCONFIG_CONFIG=.config
fi
fi
KCONFIG_CONFIG 接收可能尚不存在的.config 文件的路径。