readlink 是什么
readlink 打印符号链接指向的目标路径;加 -f 时会沿着各级链接递归解析,给出最终的真实路径。这个能力在两类场景里最有用:确认版本切换软链(例如 current)当前指向哪个版本,以及确认某个命令或服务实际加载的是哪个文件的真实路径。realpath 是能力更完整的相关命令,能处理不存在或部分缺失的路径。
基本信息
| 用途 | 查看与解析符号链接的目标路径 |
|---|---|
| 语法 | readlink [选项] 链接;readlink -f 需要路径存在;-m 允许中间路径不存在 |
| 相关命令 | realpath 同样做路径规范化,还提供相对路径计算等选项 |
| 所属 | GNU coreutils |
典型使用场景
- 发布核对:切链后确认 current 指向的版本目录是否正确
- 依赖定位:确认 python3、java 这类命令最终指向哪个真实可执行文件
- 进程溯源:查看 /proc 下可执行文件链接,确认进程实际运行的是哪个二进制
- 路径规范化:脚本里把相对路径或带链接的路径转成真实路径
- 断链排查:确认链接目标是否存在,区分「链接指向错」与「目标被删」
常用示例
常用示例
ls -l /opt/app/current
readlink /opt/app/current # 只打印直接目标,可能是相对路径
readlink -f /opt/app/current # 递归解析到最终真实路径
readlink -f /usr/bin/python3 # 看这条命令最终指向哪个文件
readlink -f /proc/$(pgrep -f app.jar | head -1)/exe # 进程实际运行的二进制
readlink -m /opt/app/next/conf/app.yml # 目标尚不存在时也能规范化
realpath --relative-to=/opt/app /opt/app/v2/conf # 求相对路径脚本里的用法
脚本里的用法
target=$(readlink -f /opt/app/current)
case "$target" in
/opt/app/v2026*) echo "release ok: $target" ;;
*) echo "unexpected target: $target"; exit 1 ;;
esac
[ -e "$(readlink -f /opt/app/current)" ] || echo 'broken symlink'命令对照
| 命令 | 典型用途 | 注意 |
|---|---|---|
| readlink 链接 | 只打印链接的直接目标 | 结果可能是相对路径 |
| readlink -f 路径 | 递归解析为绝对真实路径 | 要求路径存在且各级可解析 |
| readlink -m 路径 | 允许路径不存在 | 适合在创建前预演目标路径 |
| realpath 路径 | 路径规范化,功能等同 -f | 提供相对路径与批量处理选项 |
| realpath --relative-to | 计算相对某目录的路径 | 脚本拼路径时很实用 |
不加任何选项的 readlink 只打印链接里写的那个目标,如果它本身是相对路径,输出也会是相对路径。脚本消费前统一用 -f 或 -m 规范化,能避免大量路径拼接类问题。
-f 要求整条路径都真实存在,任何一级缺失都会直接报错。做「目标还不存在」的探测时改用 -m,否则会把正常的待创建路径误判成错误。