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

sen*_*rio 10 bash symlink

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

#!/bin/bash
echo "my path is ..."
Run Code Online (Sandbox Code Playgroud)

koj*_*iro 18

readlink不是标准命令,但它在Linux和BSD上很常见,包括OS X,它是您问题最直接的答案.BSD和GNU readlink实现是不同的,所以请阅读您所拥有的文档.

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

如果符号链接也是一个目录,那么

cd -P "$symlinkdir"
Run Code Online (Sandbox Code Playgroud)

会让你进入dereferenced目录,所以

echo "I am in $(cd -P "$symlinkdir" && pwd)"
Run Code Online (Sandbox Code Playgroud)

将回显完全取消引用的目录.也就是说,cd -P取消引用整个路径,因此如果在同一路径中有多个符号链接,则可能会产生意外结果.

如果符号链接是文件而不是目录,则可能不需要取消引用该链接.大多数命令都无害地遵循符号链接.如果您只想检查文件是否是链接,请使用test -L.

  • `pwd`也有`-P`选项.如果您已经在目录中,则可以执行:`pwd -P`.如果你不在:`(cd/path/w/symlinks/&& pwd -P)` (4认同)

小智 6

如果你在 Linuxreadlink -f $LINK和 mac上工作,你也可以使用它greadlink -f $LINK


Aru*_*ius 5

假设我们有真实的脚本或文件以及指向它的符号链接:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ realpath symlink
/home/test/realscript.sh
Run Code Online (Sandbox Code Playgroud)

另请参见原件:

realpath realscript.sh
/home/test/realscript.sh
Run Code Online (Sandbox Code Playgroud)

在脚本中也很好的组合是用于dirname保存

$ dirname /home/test/realscript.sh
/home/test
Run Code Online (Sandbox Code Playgroud)

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

echo  $( dirname $(realpath "symlink") )
Run Code Online (Sandbox Code Playgroud)

或获取并存储在可变的真实脚本主目录中:

script_home=$( dirname $(realpath "$0") )
echo Original script home: $script_home
Run Code Online (Sandbox Code Playgroud)

为了测试所有内容,我们将symlink放在/ home / test2 /中,修改一些其他内容,然后从根目录运行/调用它:

/$ /home/test2/symlink
/home/test
Original script home: /home/test
Original script is: /home/test/realscript.sh
Called script is: /home/test2/symlink
Run Code Online (Sandbox Code Playgroud)

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