我将在这里进行简短的回顾和分析,但对于那些 TL;DR 这里是 bash 的单行,用于锚定工作目录:
script_home=$( dirname $(realpath "$0") )
或者您可以使用任何其他文件名而不是 $0 来确定它的真实位置。
不仅存在确定某些文件的真实路径的问题,尤其是某些脚本是通过符号链接从另一个位置调用的,并且需要引用相对于它的真实工作目录的其他资源。
详情如下。假设我们有真正的脚本或文件以及指向它的符号链接:
$ 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 "$0") )
echo Original script home: $script_home
其中“$0”在 shell 脚本中被定义为“self”。
为了测试所有内容,我们将符号链接放入 /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
请尝试自己编写修改后的输出:)
2021年更新,还有命令:
readlink - 打印已解析的符号链接或规范文件名
描述
注意 realpath(1) 是用于规范化功能的首选命令。