当通过符号链接调用时,如何在脚本内部获取脚本文件路径

10 浏览
0 Comments

当通过符号链接调用时,如何在脚本内部获取脚本文件路径

当我需要在脚本内部获取脚本文件的路径时,我会使用类似这样的代码:

`dirname $0`

这在我直接调用脚本时效果很好,但如果我通过符号链接调用脚本,上述代码会打印出链接的位置而不是原始文件的位置。

是否有办法获取原始脚本文件的路径,而不是链接的路径?

谢谢,

Mike

0
0 Comments

这篇文章讨论了在通过符号链接调用脚本时,脚本本身如何获取脚本文件路径的问题。作者指出,使用$0变量的方法并不可靠,因为当应用程序以非应用程序路径的零参数启动时,这些方法将失败。例如,login(1)会在$0中的应用程序名称前加上一个"-",导致错误,并且每当调用位于PATH中的应用程序时,$0将不包含应用程序的路径,而只包含文件名,这意味着无法从中提取任何位置信息。文章中还指出了其他可能导致失败的情况。

作者建议不要依赖这种方法,因为实际上无法确定脚本的位置,所以最好使用配置选项来设置配置文件的目录或其他需要脚本路径的内容。

感谢作者提供了详细的答案,读者表示会查看相关的FAQ。

0
0 Comments

问题原因:在使用符号链接调用脚本时,无法直接获取脚本文件的路径。

解决方法:使用readlink命令来解决这个问题,具体实现代码如下:

readlink -f "$0"

0
0 Comments

问题的原因是,当通过符号链接调用脚本时,脚本本身需要获取脚本文件的路径。解决方法是通过判断脚本文件是否为符号链接,并使用不同的命令来获取脚本文件的路径。

具体解决方法如下所示:

if [ -L $0 ] ; then
    DIR=$(dirname $(readlink -f $0)) ;
else
    DIR=$(dirname $0) ;
fi ;

上述代码通过判断`$0`是否为符号链接(`-L`),来决定使用不同的命令来获取脚本文件的路径。如果是符号链接,则使用`readlink -f`命令来获取符号链接的实际路径;如果不是符号链接,则直接使用`dirname $0`命令来获取脚本文件的路径。

如果`readlink`命令不可用,可以参考这个链接中的回答来解决:[how to resolve symlinks in a shell script](http://stackoverflow.com/questions/7665)。

关于为什么需要在`$0`是符号链接或非符号链接时运行不同的命令,可以参考这个链接:[apply readlink to a non symlink file](https://unix.stackexchange.com/questions/432475/apply-readlink-to-a-non-symlink-file)。

不管`$0`是否包含符号链接,为什么不直接使用`$(dirname $(readlink -f $0))`命令来获取脚本文件的路径呢?

0