![realpath(GNU coreutils 8.22)确实解析了“。”符号链接,而不管“-s”](https://linux22.com/image/1413566/realpath%EF%BC%88GNU%20coreutils%208.22%EF%BC%89%E7%A1%AE%E5%AE%9E%E8%A7%A3%E6%9E%90%E4%BA%86%E2%80%9C%E3%80%82%E2%80%9D%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%EF%BC%8C%E8%80%8C%E4%B8%8D%E7%AE%A1%E2%80%9C-s%E2%80%9D.png)
我正在尝试使用真实路径在脚本中,必须确保它位于某个(可能是符号链接的)路径下。此外,脚本必须可从任何位置运行,因此它不能假定当前目录是包含脚本的目录。但是...
$ mkdir dir
$ touch dir/script
$ ln -s dir symlink
$ realpath -s symlink/script
/tmp/symlink/script
$ realpath -s symlink
/tmp/symlink
目前一切都很好:realpath
默认情况下会解析符号链接,但是-s
switch 只是做了我们需要的事情。
$ cd symlink
$ realpath -s script
/tmp/dir/script
$ realpath -s .
/tmp/dir
为什么在这种情况下结果与没有结果相同-s
?即使有人假设符号链接解析对当前目录有特殊的作用,但无论如何这里还是存在不一致:
$ realpath -s ../symlink/script
/tmp/symlink/script
答案1
的手册页realpath
显示:
realpath -s filename
当使用 -s 选项时,realpath 仅删除 . 和 .. 目录,但不删除 filename 中的符号链接。如果给定的 filename 参数是相对的(即不以 '/' 开头),realpath -s 会在进一步处理之前将从 getcwd(2) 系统调用获得的当前目录名称添加到其中。
当您调用realpath -s script
并且script
没有符号链接时,realpath 只会在前面添加由 给出的当前工作目录pwd
。
然而,realpath 的行为似乎取决于它的 getcwd() 实现;在 cygwin 下realpath -s script
显示绝对路径。
您可以获得绝对路径,例如
realpath -s $(pwd -P)/script
打印pwd -P
当前工作目录的完整文件名,避免所有符号链接。
或者使用
readlink -e script
其中-e
表示“通过递归跟踪给定名称的每个组件中的每个符号链接进行规范化”。