从 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"
其中 .env
是 key=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 的内容,而不是另一个会话中的内容。
我的项目目录结构如下:
myproj/
.env
setenv.sh
run.sh
其中 run.sh
看起来像:
#!/bin/sh
sh setenv.sh
echo "$fizz"
其中 .env
是 key=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 的内容,而不是另一个会话中的内容。