gpt4 book ai didi

linux - 为目录应用 bash 变量(递归)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:39 27 4
gpt4 key购买 nike

我有一个项目需要我保留大量带有安装/维护/任何脚本的 bash 文件,其中大部分需要知道其他文件夹的位置。现在这一切都是用相对路径制作的,但这让我保留了文件夹结构,从长远来看这可能不是最好的主意。

因此,作为示例,我有这个文件 (script.sh):

THINGS_DIR=..\..\things
myprogram $THINGS_DIR

但现在我想要 2 个文件,其中一个包含来自这些目录的全局变量(我们称之为 conf.sh):

THINGS_DIR=./things/
OTHERS_DIR=./things/others/

并且,在 script.sh 上,我会以某种方式使用这些变量。

我能找到的最好方法是将 conf.sh 保存在一个固定的位置,所有其他人在它开始之前运行它,但我试图找到一个更好的解决方案。

编辑

我忘了说这是在 Git 存储库中,这是一个合理的假设,可以一直保持下去。话虽这么说,因为我想尽可能地保持它的独立性,所以我最终在需要这些变量的每个脚本中都使用了它:

. $(git rev-parse --show-toplevel)/my_conf_file.conf

此命令执行位于 git 存储库根目录中的 my_conf_file.conf 中的内容。它并不理想(也不完全安全),但它可以用最少的配置来解决问题。

最佳答案

一个常见的习惯用法是在多个目录中的一个(或多个)目录中放置一个配置文件,然后让您的脚本按顺序检查每个目录。例如你可以搜索:

/etc/script.cfg     # global
~/.script.cfg # user-specific, hidden with leading dot

作为最后的手段,您也可以搜索环境。这种搜索策略在 bash 中很容易实现。您所要做的就是:

[[ -e /etc/script.cfg ]] && . /etc/script.cfg
[[ -e ~/script.cfg ]] && . ~/script.cfg

echo "THINGS_DIR=$THINGS_DIR"
echo "OTHERS_DIR=$OTHERS_DIR"

如果这两个配置文件存在,它会获取它们。如果用户副本存在,它将覆盖全局设置。如果两者都不存在,脚本自然会使用任何环境变量。这样用户就可以像这样覆盖配置设置:

THINGS_DIR=/overridden/things/dir script.sh

关于linux - 为目录应用 bash 变量(递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35893366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com