我有一个实用程序,由几个目录组成,其中包含一些 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)"