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

时间:2009-05-28 13:12:15

标签: linux bash scripting

当我需要获取脚本本身内部脚本文件的路径时,我会使用以下内容:

`dirname $0`

工作文件,直到我通过sym链接调用脚本。在这种情况下,上面的代码打印链接的位置而不是原始文件。

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

谢谢, 麦克

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:15)

真的需要阅读以下BashFAQ文章:

事实是,$0黑客不可靠,并且只要应用程序以不是应用程序路径的第0个参数启动,它们就会失败。例如,login(1)会在-中将$0放在您的应用程序名称前面,导致破坏,并且每当您调用PATH $0中的应用程序时将不包含应用程序的路径,只包含文件名,这意味着您无法从中提取任何位置信息。还有很多方法可能会失败。

底线:不要依赖黑客,事实是你不能弄清楚你的脚本在哪里,所以使用配置选项设置配置文件的目录或者你需要的任何东西脚本的路径。

答案 2 :(得分:6)

使用readlink

readlink -f "$0"

答案 3 :(得分:1)

Dir=$(dirname $(readlink -f "$0"))

答案 4 :(得分:0)

我建议这个:

dirname $(realpath $0)

示例:

skaerst@test01-centos7:~/Documents> ../test/path.sh 
dirname realpath: /home/skaerst/test

skaerst@test01-centos7:~/Documents> cat ../test/path.sh
#!/bin/bash

echo "dirname realpath: $(dirname $(realpath $0))"

也适用于符号链接,因为realpath默认使用-P:

skaerst@test01-centos7:~/Documents> ln -s ../test/path.sh p
skaerst@test01-centos7:~/Documents> ./p
dirname realpath: /home/skaerst/test

realpath可用于coreutils> 8.5,我想

skaerst@test01-centos7:~/Documents> rpm -qf $(which realpath) $(which dirname)
coreutils-8.22-15.el7_2.1.x86_64
coreutils-8.22-15.el7_2.1.x86_64

HTH

此致

的Stefan