从键/值对文件中设置环境变量

如何将一组键/值对从文本文件导出到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但同样的问题仍然适用


也许还有其他方法可以做到,我只需要使用传递的文件的环境变量作为脚本的参数即可。


繁花如伊
浏览 471回答 3
3回答

莫回无

你的方法的问题是export在while循环中一个子壳发生,这些变量不会在当前的shell(while循环的父shell)可用。export在文件本身中添加命令:export MINIENTREGA_FECHALIMITE="2011-03-31"export MINIENTREGA_FICHEROS="informe.txt programa.c"export MINIENTREGA_DESTINO="./destino/entrega-prac1"然后,您需要使用以下命令在当前shell中获取文件的来源:. ./conf/prac1要么source ./conf/prac1

开心每一天1111

这可能会有所帮助:export $(cat .env | xargs) && rails c我之所以使用它,是因为我想.env在Rails控制台中进行测试。gabrielf提出了一种使变量保持局部的好方法。这解决了从一个项目到另一个项目时的潜在问题。env $(cat .env | xargs) rails我已经用 bash 3.2.51(1)-release更新:要忽略以开头的行#,请使用以下命令(感谢Pete的注释):export $(grep -v '^#' .env | xargs)而且,如果要对unset文件中定义的所有变量进行操作,请使用以下命令:unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)更新:要同时使用空格处理值,请使用:export $(grep -v '^#' .env | xargs -d '\n')在GNU系统上-或:export $(grep -v '^#' .env | xargs -0)在BSD系统上。

叮当猫咪

allexport在此处的其他几个答案中也提到了该选项,这set -a是快捷方式。提供.env确实比循环循环并导出更好,因为它允许注释,空白行甚至命令生成的环境变量。我的.bashrc包括以下内容:# .env loading in the shelldotenv () {  set -a  [ -f .env ] && . .env  set +a}# Run dotenv on logindotenv# Run dotenv on every new directorycd () {  builtin cd $@  dotenv}
打开App,查看更多内容
随时随地看视频慕课网APP