注意:我非常努力地确保这不是重复的,并且没有问过这个问题bash。据我所知,它不是重复的。
因为我对这样做的所有方式都感兴趣,并且由于git我的 OP 中强调这是一个回购,所以我不会要求答案仅使用 SHELL BUILTIN 命令,但会优先考虑仅使用的答案shell 内置函数。
我在问题中包含的脚本是我使用纯 shell 脚本回答问题的最佳尝试。
我有一个目录结构复杂的大型 bash 项目。让我们bash先把我为什么选择的问题放在一边,而不是像python.
我git用于对项目进行版本控制,该项目应该能够在用户空间的任何位置分发和安装并正常运行。因此,我有以下要求:
我希望能够将各种脚本移动到不同的目录中,而不会破坏或改变它们的运行方式。在这种情况下,可以修改脚本的执行方式(例如,通过使用其他脚本中正确的更新路径),但是在将脚本移动到新目录后,不必重写脚本的内部结构,以确保它继续工作。
我希望每个脚本都source来自vars.sh项目根目录中的一个文件中的重要变量,这样如果我决定更改项目的目录结构,我就不必在每个脚本中编辑这些变量。因此,每个脚本都需要知道项目根目录在哪里。
此类变量的示例:包含项目内目录config绝对路径或目录绝对路径等的变量tmp)。这将是确定要重新写vars.sh,如果目录结构被改变,当然,本身。但我们的想法是只需要重写vars.sh(如果脚本被移动,则适当地调用脚本)。
git,“项目根”可以定义为git的项目树根,即有目录的.git目录。据我所知,要求2任何脚本source变量和/或函数本身都需要回答这篇文章的主要问题。根据我的经验,source使用相对路径名的命令,例如
source "../../vars.sh"
Run Code Online (Sandbox Code Playgroud)
产生一个错误“没有这样的文件或目录”中bash,并侵犯了我的假设2和要求1。
请注意,DIR通过查找脚本目录的绝对路径创建的变量,使用
DIR="$( cd …Run Code Online (Sandbox Code Playgroud)