为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2019-11-04 15:05:39
如何将一组键/值对从文本文件导出到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 $linedone但是当我minientrega.sh prac1在命令行中执行时,它不会设置环境变量我也尝试使用,source ./conf/$1但同样的问题仍然适用也许还有其他方法可以做到,我只需要使用传递的文件的环境变量作为脚本的参数即可。
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

你的方法的问题是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


查看完整回答
反对 回复 2019-11-04
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这可能会有所帮助:


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系统上。


查看完整回答
反对 回复 2019-11-04
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

allexport在此处的其他几个答案中也提到了该选项,这set -a是快捷方式。提供.env确实比循环循环并导出更好,因为它允许注释,空白行甚至命令生成的环境变量。我的.bashrc包括以下内容:


# .env loading in the shell

dotenv () {

  set -a

  [ -f .env ] && . .env

  set +a

}


# Run dotenv on login

dotenv


# Run dotenv on every new directory

cd () {

  builtin cd $@

  dotenv

}


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 470 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信