从 bash 脚本中的文件读取和导出键值对(无缓存)

Reading and exporting key-value pairs from a file in bash script (without caching)

我的项目目录结构如下:

myproj/
    .env
    setenv.sh
    run.sh

其中 run.sh 看起来像:

#!/bin/sh

sh setenv.sh

echo "$fizz"

其中 .envkey=value 对的属性文件,如下所示:

fizz=buzz
foo=bar
color=red

setenv.sh 脚本需要从 .env 和 export/source 中读取键值对,以便 run.sh 可以在 [=59= 引用它们]time,他们将评估 .env.

中的任何值

run.sh 脚本和 setenv.sh 脚本需要 运行 on Linux and/or Mac(所以 uname'Linux''FreeBSD''Darwin'),我需要能够 运行 run.sh 一遍又一遍,每次在 [=16= 中使用不同的值], 并让它们对每个 运行.

生效

目前我的 setenv.sh 看起来像:

#!/bin/sh
unamestr=$(uname)
if [ "$unamestr" = 'Linux' ]; then
    export $(grep -v '^#' .env | xargs -d '\n')
elif [ "unamestr" = 'FreeBSD' ] || [ "unamestr" = 'Darwin' ]; then
    export $(grep -v '^#' .env | xargs -0)
fi

当我 运行 sh run.sh 时,它回显值 buzz。但是,如果我将 fizz 更改为另一个值,例如 buzz2,然后重新 运行 run.sh,它仍然会输出 fizz 值 [=32] =].我该怎么做才能使 .env 中的值始终动态 loaded/exported/sourced/etc。在 run.sh 的每个 运行 上?

问题是当您 运行 sh setenv.sh 它启动一个新的 shell 会话并且 运行 那里有脚本。所以,配置的是新会话的环境,不是你的。

正如@Philippe 建议的那样,您应该“来源”setenv.sh:

source setenv.sh # this is one way
. setenv.sh # this is another way

echo "$fizz"

以上代码 运行 是当前会话中 setenv.sh 的内容,而不是另一个会话中的内容。