解释readlink命令的选项

解释readlink命令的选项

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 -freadlink并不关心该路径的最后一部分(此处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 文件的路径。

相关内容