小编Lif*_*ign的帖子

项目根目录的第N个子目录中的bash脚本如何可靠地知道项目根目录的绝对路径?

注意:我非常努力地确保这不是重复的,并且没有问过这个问题bash。据我所知,它不是重复的。

因为我对这样做的所有方式都感兴趣,并且由于git我的 OP 中强调这是一个回购,所以我不会要求答案仅使用 SHELL BUILTIN 命令,但会优先考虑仅使用的答案shell 内置函数。

我在问题中包含的脚本是我使用纯 shell 脚本回答问题的最佳尝试。

语境

我有一个目录结构复杂的大型 bash 项目。让我们bash先把我为什么选择的问题放在一边,而不是像python.

git用于对项目进行版本控制,该项目应该能够在用户空间的任何位置分发和安装并正常运行。因此,我有以下要求:

要求

  1. 我希望能够将各种脚本移动到不同的目录中,而不会破坏或改变它们的运行方式。在这种情况下,可以修改脚本的执行方式(例如,通过使用其他脚本中正确的更新路径),但是在将脚本移动到新目录后,不必重写脚本的内部结构,以确保它继续工作。

  2. 我希望每个脚本都source来自vars.sh项目根目录中的一个文件中的重要变量,这样如果我决定更改项目的目录结构,我就不必在每个脚本中编辑这些变量。因此,每个脚本都需要知道项目根目录在哪里。

此类变量的示例:包含项目内目录config绝对路径或目录绝对路径等的变量tmp)。这是确定要重新写vars.sh,如果目录结构被改变,当然,本身。但我们的想法是需要重写vars.sh(如果脚本被移动,则适当地调用脚本)。

假设

  1. 我在用git,“项目根”可以定义为git的项目树根,即有目录的.git目录。
  2. 在脚本中,任何脚本都不需要被告知它有多少个子目录。

讨论和提议的解决方案

据我所知,要求2任何脚本source变量和/或函数本身都需要回答这篇文章的主要问题。根据我的经验,source使用相对路径名的命令,例如

source "../../vars.sh"
Run Code Online (Sandbox Code Playgroud)

产生一个错误“没有这样的文件或目录”bash,并侵犯了我的假设2和要求1

请注意,DIR通过查找脚本目录的绝对路径创建的变量,使用

DIR="$( cd …
Run Code Online (Sandbox Code Playgroud)

git directory bash shell

2
推荐指数
1
解决办法
181
查看次数

标签 统计

bash ×1

directory ×1

git ×1

shell ×1