realpath 默认解析符号链接并要求路径存在,需用 -s 保留链接、-m 处理不存在路径;批量处理用多参数更可靠,脚本中获取自身目录推荐 realpath "$0"。

直接用 realpath 就能拿到绝对路径,不用额外判断当前目录或拼接 $PWD,但默认行为对不存在的路径会报错,这点必须注意。
realpath 解析符号链接时默认跟随,不加选项就返回真实目标路径
比如 /usr/bin/python 是个软链,指向 /usr/bin/python3.10,执行:
realpath /usr/bin/python
输出就是 /usr/bin/python3.10,不是链接本身。这和 readlink -f 行为一致。
- 想保留链接路径、不解析?加
-s或--no-symlinks - 想只在部分层级解析(比如父目录有
..但链接不跟)?用-L,但实际中极少需要 - 脚本里依赖“链接即路径”的逻辑时,漏掉
-s会导致后续cp或test -e判定失败
路径不存在时 realpath 默认报错,要用 -m 或 --canonicalize-missing
执行 realpath nonexistent/file.txt 会输出类似 realpath: nonexistent/file.txt: No such file or directory 的错误,并返回非零退出码——这对脚本是硬伤。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 要让它安静地返回规范化路径(如
/home/user/nonexistent/file.txt),必须加-m -
-e(默认隐含)要求所有中间目录都存在;-m放宽限制,只做字符串规范化 - 如果路径含
../且上层不存在,-m仍能算出逻辑路径,但test -d之类操作仍会失败
批量处理多个路径时,realpath 一次调用比循环更可靠
传入多个参数,realpath 会按顺序逐个输出,每行一个:
realpath ./a ../b/c /tmp/link
比写 for p in ./a ../b/c /tmp/link; do realpath "$p"; done 更简洁,也避免了子 shell 环境变量污染或引号处理问题。
- 路径含空格?加
-z让输出用\0分隔,配合xargs -0安全消费 - 想让结果相对于某个目录(比如部署时统一转成相对路径)?用
--relative-to=/opt/app - 别用
realpath *直接展开通配符——如果当前目录没匹配项,shell 会原样传*给realpath,导致报错
Shell 脚本里获取自身所在目录,realpath "$0" 是最稳写法
很多人用 cd "$(dirname "$0")"; pwd,但这种写法会改变当前工作目录,且在 symlink 场景下失效。
- 正确姿势:
SCRIPT_DIR=$(dirname "$(realpath "$0")") - 如果脚本可能被 symlink 调用,又想定位 symlink 所在目录(而非目标位置),才用
dirname "$(realpath -s "$0")" -
realpath在绝大多数 Linux 发行版中属于coreutils,无需额外安装;但 Alpine 等精简系统需先apk add coreutils
真正容易被忽略的是:realpath 对路径中每个组件的存在性默认敏感,而脚本往往要处理“即将创建”的路径。不加 -m 的调用,在 CI/CD 或容器初始化阶段极易静默失败。










