我有这个:
file_path="/actual/file/path"
read_link="$(readlink "$file_path")" # just in case it's a symlink
如果 readlink 不是符号链接,它会回显空字符串吗?是否有一个 readlink 选项,如果它不是符号链接,它只会回显原始路径?
答案1
对于 GNU/Linux 系统,-f
标志为readlink
( --canonicalize
),«通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化» 将为您做到这一点:
touch /tmp/real
ln -s /tmp/real /tmp/link
readlink -f /tmp/real # → "/tmp/real"
readlink -f /tmp/link # → "/tmp/real"
对于 Mac OSX 系统,没有选项可以执行此操作,«如果给定的参数不是符号链接,readlink
则不会打印任何内容并退出并出现错误»。
对于这两个系统,您都可以找到 的文档和所有可用readlink
选项man readlink
。
您能得到的最接近 OSX 上的通用解决方案是类似于此函数
readlinkorreal() { readlink "$1" || echo "$1"; }
readlinkorreal /tmp/real # → "/tmp/real"
readlinkorreal /tmp/link # → "/tmp/real"
答案2
给定以下文件结构:
test/
├── link -> no-link
└── no-link
该-m
选项似乎可以解决问题。
florin@debian:/tmp/test$ readlink -m link
/tmp/test/no-link
florin@debian:/tmp/test$ readlink -m no-link
/tmp/test/no-link
答案3
readlink -f
这样做(正如 @roaima 的回答中提到的)。
macOS 12.3 有增加了支持对于此选项,您现在可以在 Linux 和 macOS 上使用它。