我正在创建一个纯粹用 bash 编写的包(weffe),其中包含脚本需要访问的可执行文件和静态文件。但是,如果使用 git 克隆包或者将其安装到文件夹/usr/bin/weffe
中的数据,我希望该脚本能够使用本地文件运行/usr/share/weffe
。如果包是从命令行运行的,例如,如果weffe
在终端上运行,那么二进制文件是否可以/usr/share/weffe
通过运行类似命令whereis
或访问 shell 变量来了解其自己的安装目录(在本例中)?
如果这不可能,最好的选择是什么?我考虑过的一些事情是制作一个 Makefile,在构建过程中手动为安装目录创建一个变量,或者/usr/share/weffe
在尝试从该位置访问文件之前检查硬编码目录是否存在。任何帮助,将不胜感激。
答案1
考虑将weffe
可执行文件定位/usr/share/weffe/weffe-or-other-name
在目录中,然后链接到该bin
目录,例如cd /usr/bin; ln -s ../share/weffe/weffe
.
您的脚本可以使用该命令找到其位置dirname
。当它是符号链接时,将返回符号链接路径。因此,如果您想找到它的“真实”路径,那么您可以使用dirname
和的组合readlink
。
#!/usr/bin/env bash
# Assuming you have soft linked in the bin dir.
# cd /usr/bin; ln -s ../share/weffe/weffe
# /usr/share/weffe/weffe
script_path="$(dirname "$0")"
# GNU readlink requires a -f argument.
# macOS realink does not require -f argument.
script_real_relative_path="$(readlink "$0")"
echo "script path: $script_path"
echo "script real path: $script_real_relative_path"