当前位置: 首页 > 知识库问答 >
问题:

从键/值对文件中设置环境变量[重复]

牧献
2023-03-14

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 时,它不会设置环境变量

我还尝试使用< code>source。/conf/$1但是同样的问题仍然存在

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

共有3个答案

马侯林
2023-03-14

您的方法的问题是while循环中的export发生在子shell中,并且这些变量在当前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
鲍理
2023-03-14

< code>-o allexport允许导出以下所有变量定义。< code> o allexport禁用此功能。

set -o allexport
source conf-file
set +o allexport
##########################################################
# CAUTION: this does not work when executed from a script, 
# it must be copied to and run from the current terminal!
##########################################################
琴英华
2023-03-14

这可能会有所帮助:

export $(cat .env | xargs) && rails c

我使用它的原因是,如果我想在我的 rails 控制台中测试 .env 的东西。

gabrielf想出了一个保持变量局部性的好方法。这解决了从一个项目到另一个项目的潜在问题。

env $(cat .env | xargs) rails

我已经用< code > bash 3 . 2 . 51(1)-release 对此进行了测试

更新:

要忽略以< code>#开头的行,请使用以下代码(感谢Pete的注释):

export $(grep -v '^#' .env | xargs)

如果您想要< code >取消设置文件中定义的所有变量,请使用以下命令:

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

更新:

若要同时处理带空格的值,请使用:

export $(grep -v '^#' .env | xargs -d '\n')

在GNU系统上——或者:

export $(grep -v '^#' .env | xargs -0)

在BSD系统上。

通过此答案,您可以使用以下命令自动检测操作系统

export-env.sh

#!/bin/sh

## Usage:
##   . ./export-env.sh ; $COMMAND
##   . ./export-env.sh ; echo ${MINIENTREGA_FECHALIMITE}

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

 类似资料:
  • 我如何将一组键/值对从文本文件导出到shell环境中? 以下是问题的原始版本,并举例说明,以资记录。 我正在bash中编写一个脚本,它解析某个文件夹中包含3个变量的文件,这是其中之一: 然后,我的脚本minientrega.sh使用以下代码解析文件: 但是当我在命令行中执行时,它不会设置环境变量 我还尝试使用,但同样的问题仍然存在

  • 假设我有. env文件包含如下行: 不像普通的文件有< code>export前缀,所以我不能直接获取文件。 创建从. env文件加载内容并将其设置为环境变量的外壳脚本的最简单方法是什么?

  • 为了给OpenStack命令行客户端提供所需的环境变量,您必须创建OpenStack RC文件,或者说叫openrc.sh文件。如果您安装的时候有这个文件,您可以在OpenStack控制台用任意一个用户下载到这个文件。这个针对某个project有效地文件包含了所有OpenStack服务所需的关键信息。 当您手动载入这个文件时,里面的环境变量配置便会加载进当前Shell中。这些环境变量连接了本地的O

  • 我想在启动脚本中设置环境变量(如),同时仍然能够仅用一个命令启动应用程序。

  • ENV 设置环境变量 格式有两种: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... 这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。 ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet" 这个例子中演示了如何换行,以

  • 问题内容: 我希望能够在交互式sbt shell中设置环境变量,但我似乎找不到找到这种方法的方法。(我看过官方的sbt文档以及stackoverflow都没有成功)。 我想说明的是, 我不需要 在文件中设置此环境变量,而是可以在交互式sbt shell会话中即时更改它,以便将环境变量用于下一个我运行的sbt命令。 例如,我希望能够做类似的事情(在sbt shell中): 这可能吗?如果是的话,我该