Bash: 如何获取符号链接的真实路径?

Bash: how to get real path of a symlink?

是否有可能通过在 /usr/local/bin 文件夹中执行符号链接的文件来获取原始脚本的绝对路径?好吧,.. 我知道原始文件在哪里,我知道它是因为我正在链接它。但是,...我希望这个脚本能正常工作,即使我移动了原始源代码(和符号链接)。

#!/bin/bash
echo "my path is ..."

readlink 不是标准命令,但它在 Linux 和 BSD 上很常见,包括 OS X,这是对您的问题最直接的回答。 BSD 和 GNU readlink 实现不同,因此请阅读您所拥有的那个的文档。

如果readlink不可用,或者您需要编写一个不绑定特定实现的跨平台脚​​本:

如果symlink也是一个目录,那么

cd -P "$symlinkdir"

会让你进入取消引用的目录,所以

echo "I am in $(cd -P "$symlinkdir" && pwd)"

将回显完全取消引用的目录。也就是说,cd -P 取消对整个路径的引用,因此如果您在同一路径中有多个 symlink,您可能会得到意想不到的结果。

如果 symlink 指向一个文件,而不是一个目录,您可能不需要取消引用 link。大多数命令无害地遵循 symlinks。如果您只想检查文件是否为 link,请使用 test -L.

假设我们有真实的脚本或文件和符号link:

$ ls -la
-rwxr-xr-x 1 root    root  0 Mar 20 07:05 realscript.sh
lrwxrwxrwx 1 root    root 10 Mar 20 07:05 symlink -> realscript.sh

GNU coreutils 部分是一些非常有用的命令:

$ realpath symlink
/home/test/realscript.sh

另见原文:

realpath realscript.sh
/home/test/realscript.sh

另外一个很好的脚本组合是在脚本

上使用dirname
$ dirname /home/test/realscript.sh
/home/test

所以总结一下,你可以在脚本中使用

echo  $( dirname $(realpath "symlink") )

或获取并存储在变量真实脚本主目录中并保存代码以获取真实路径脚本realscript.sh:

script_home=$( dirname $(realpath "[=15=]") )
echo Original script home: $script_home

其中“$0”在 shell 脚本中定义为“self”。

为了测试一切,我们将 symlink 放入 /home/test2/,修改一些额外的东西,然后 run/call 从根目录:

$ /home/test2/symlink
/home/test
Original script home: /home/test
Original script is: /home/test/realscript.sh
Called script is: /home/test2/symlink

请尝试自己编写修改后的输出:)

更新2021,还有命令:

读取link - 打印已解析的符号 link 或规范文件名

描述 注意 realpath(1) 是用于规范化功能的首选命令。

如果您正在 Linux readlink -f $LINK 和 mac 上工作,您也可以使用 greadlink -f $LINK