我正在尝试使用真实路径在脚本中,必须确保它位于某个(可能是符号链接的)路径下。此外,脚本必须可从任何位置运行,因此它不能假定当前目录是包含脚本的目录。但是...
$ 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
表示“通过递归跟踪给定名称的每个组件中的每个符号链接进行规范化”。