如何解析shell脚本中父目录的符号链接?

时间:2013-11-04 14:42:30

标签: shell proguard symlink dirname

以下行介绍了shell script中的局部变量PROGUARD_HOME

PROGUARD_HOME=`dirname "$0"`/..

这指向shell脚本的父文件夹。该脚本正常执行。 - 然后,我创建了引用/usr/local/bin/proguard的符号链接~/bin/proguard4.10/bin/proguard.sh。当我使用符号链接PROGUARD_HOME运行proguard时,不再正确解析。这会导致shell脚本输出以下错误消息:

  

错误:无法访问jarfile / usr / local / bin /../ lib / proguard.jar

如何重写环境变量的分配,以便解析符号链接(如果存在)? 我在resolving symbolic links in shell scripts上发现了一个非常相似的问题,但仍然无法弄清楚如何将这些解决方案与父文件夹方法结合起来。

1 个答案:

答案 0 :(得分:1)

我认为readlink -f $0可以显示shell脚本本身的目标,然后是dirname来剥离脚本,然后另一个readlink -f就可以解决:

PROGUARD_HOME=$(readlink -f $(dirname $(readlink -f "$0"))/..)

更详尽的细分:

echo "\$0 is $0"
TRUENAMEOFSCRIPT=$(readlink -f $0)
echo "readlink -f of \$0 reveals $TRUENAMEOFSCRIPT"

DIRNAMEOFSCRIPT=$(dirname $TRUENAMEOFSCRIPT)
echo "The script lives in directory $DIRNAMEOFSCRIPT"

PARENTDIR=$(readlink -f "$DIRNAMEOFSCRIPT"/..)
echo "Its parent dir is $PARENTDIR"