realpath(GNU coreutils 8.22)确实解析了“。”符号链接,而不管“-s”

realpath(GNU coreutils 8.22)确实解析了“。”符号链接,而不管“-s”

我正在尝试使用真实路径在脚本中,必须确保它位于某个(可能是符号链接的)路径下。此外,脚本必须可从任何位置运行,因此它不能假定当前目录是包含脚本的目录。但是...

$ mkdir dir
$ touch dir/script
$ ln -s dir symlink
$ realpath -s symlink/script
/tmp/symlink/script
$ realpath -s symlink       
/tmp/symlink

目前一切都很好:realpath默认情况下会解析符号链接,但是-sswitch 只是做了我们需要的事情。

$ 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表示“通过递归跟踪给定名称的每个组件中的每个符号链接进行规范化”。

相关内容