TL;DR:如何从文本文件中导出一组键/值对到shell环境中?
为了记录在案,以下是问题的原始版本,并附有示例。
我在bash中写了一个脚本,它在某个文件夹中解析带有3个变量的文件,这是其中之一:
MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"
该文件的存放路径为。/conf/prac1
我的脚本minientrega.sh然后使用以下代码解析文件:
cat ./conf/$1 | while read line; do
export $line
done
但是当我在命令行中执行minientrega.sh prac1时,它不会设置环境变量
我也尝试使用source ./conf/$1,但同样的问题仍然适用
也许还有其他方法可以做到这一点,我只需要使用我传递的文件的环境变量作为脚本的参数。
当我试图在shell中重用Docker -env-files时,我遇到了这个线程。它们的格式与bash不兼容,但很简单:name=value,没有引号,没有替换。它们还会忽略空行和#注释。
我不能完全让它与posix兼容,但这里有一个应该在bash-like shell中工作(在OSX 10.12.5的zsh和Ubuntu 14.04的bash中测试):
while read -r l; do export "$(sed 's/=.*$//' <<<$l)"="$(sed -E 's/^[^=]+=//' <<<$l)"; done < <(grep -E -v '^\s*(#|$)' your-env-file)
它不会处理上面文档链接的例子中的三种情况:
Bash: export: ' 123qwe=bar':不是有效的标识符
Bash: export: `org.spring。Config =something':不是有效的标识符
并且它不会处理传递语法(一个纯FOO)
我构建这个脚本动态地源env vars。
我使用这个脚本是因为我不想记住我在项目中使用的每个变量的名称,我不希望导出命令被存储在历史记录中或完整的.env文件导出到git。
#!/bin/sh
filename=".secret"
secret_var () {
# Parametter 1 : Environnement vars anme
bash -c 'read -p '$1=' -s voila && echo '$1'"=${voila}" > '$filename''
export `cat .secret`
rm $filename
echo ''
}
public_var () {
# Parametter 1 : Environnement vars anme
bash -c 'read -p '$1=' voila && echo '$1'"=${voila}" > '$filename''
export `cat .secret`
rm $filename
}
if [ -e $filename ]
then
echo "A file named '.secret' already exist. Remove it or edit this script."
else
public_var MY_USER_VAR
secret_var MY_PASS_VAR
fi
它非常容易使用:
# To add var MY_VAR_NAME to the env
public_var MY_VAR_NAME
# To add var MY_VAR_NAME secretly into the env
secret_var MY_VAR_NAME
例子:
callmarl@LAPTOP ~ % source set_env.sh
MY_USER_VAR=myusername
MY_PASS_VAR=
callmarl@LAPTOP ~ % env
MY_USER_VAR=myusername
MY_PASS_VAR=mysecretpass
当然,如果希望存储值,可以直接使用export,而不是public_var。