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

时间:2016-03-09 13:45:56

标签: linux bash shell

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

因此,举个例子,我有这个文件(script.sh):

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

但是现在我想要有两个文件,一个包含来自这些目录的全局变量(让我们称之为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中的内容。它不是理想的(也不是完全安全的),但只需最少的配置即可完成。

1 个答案:

答案 0 :(得分:2)

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

/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