it-swarm.cn

通过符号链接执行时获取当前脚本的路径

我有一个实用程序,该实用程序由几个目录以及一些bash脚本和支持文件组成,这些文件可能会部署到多台计算机上,并且可能位于每台计算机的不同目录中。脚本需要能够引用相对于它们自己的路径,因此我需要能够获取到当前正在执行的文件的路径。

我知道dirname $0惯用法可以在直接调用我的脚本时很好地工作。不幸的是,人们希望能够从完全不同的目录创建指向这些脚本的符号链接,并且仍然具有相对的路径逻辑功能。

总体干线结构的示例如下:

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

如何通过/usr/local/lib/foo/res/resource_file.txtscript.sh调用/usr/local/lib/foo/bin/script.sh中的~mike/bin/link_to_script

59
Mike Deck

尝试将此作为通用解决方案:

DIR="$(cd "$(dirname "$0")" && pwd)"

在以下符号链接的特定情况下,您也可以这样做:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

一条线:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

readlink -f对我不起作用,我有这个错误:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

但这很好用:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

上述脚本的一小部分。 pwd的-P选项遵循符号链接

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420