在 Linux 和 MacOS 上读取链接的选项,如果不是符号链接,将返回文件路径

在 Linux 和 MacOS 上读取链接的选项,如果不是符号链接,将返回文件路径

我有这个:

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 上使用它。

相关内容