补充说明
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