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

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

我有一个实用程序,由几个目录组成,其中包含一些 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.txt是否由orscript.sh调用?/usr/local/lib/foo/bin/script.sh~mike/bin/link_to_script

答案1

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

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

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

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

答案2

一条线:

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

答案3

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

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

但这工作正常:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR

答案4

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

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

相关内容