Linux 命令速查
文件管理 man readlink

readlink

打印符号链接指向的目标,或解析规范化的绝对路径。

返回

补充说明

readlink 是 GNU coreutils 中的命令,默认输出符号链接的目标字符串;若参数不是符号链接则不输出并以非零状态退出。它常被脚本用来获取链接的真实位置,或把相对路径规范化为绝对路径。

最常用的是 -f:递归解析路径中的所有符号链接和 ..、.,输出规范化的绝对路径;目标不存在时仍会给出结果,只要除最后一段外的父目录存在。-e 更严格,要求所有组件都存在;-m 最宽松,任何组件不存在也能解析。三者按严格程度递增选择。

注意 readlink -f 与 realpath 功能相近,后者还能处理多个路径并支持 --relative-to。在脚本中要兼容 macOS 时需注意 BSD readlink 不支持 -f,可用 cd "$(dirname "$0")" && pwd -P 之类的写法替代。

语法

readlink [选项] 文件...

选项

  • -f, --canonicalize:解析所有符号链接,输出绝对路径
  • -e, --canonicalize-existing:同 -f,但要求路径全部存在
  • -m, --canonicalize-missing:不要求路径存在
  • -n, --no-newline:不输出结尾换行
  • -q, --quiet:出错时不打印错误信息
  • -s, --silent:同 -q
  • -v, --verbose:出错时输出详细信息
  • -z, --zero:以 NUL 分隔输出

实例

# 查看符号链接指向哪里
readlink /usr/bin/awk

# 获取脚本自身所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"

# 解析配置文件的真实位置
readlink -f /etc/alternatives/editor

# 要求文件必须存在,否则返回非零
readlink -e ./missing.conf || echo "not found"

# 不输出换行,便于拼接
printf '%s\n' "$(readlink -n ./link)"

# 多个路径时配合 realpath 更直观
realpath ./a/../b

参考链接