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上的变量使它们成为命令的本地变量。

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

其他回答

如何保存变量:

printenv | sed 's/\([a-zA-Z0-9_]*\)=\(.*\)/export \1="\2"/' > myvariables.sh

如何装载它们

source myvariables.sh

最佳和简单的解决方案 环境文件env.txt

fruit=apple
vegetable=carrot

代码文件Code .sh

#!/bin/bash

source <filepath>/env.txt
echo $fruit
echo $vegetable

如果你想保持全局环境变量空间不变,我的看法是,我认为这是可取的。

创建一个像这样的脚本:

# !/bin/sh
set -o allexport
source $1
set +o allexport
shift
exec $@

然后像这样使用:

dotenv env-file my-binary

修改自@Dan Kowalczyk

我把它放在~/.bashrc中。

set -a
. ./.env >/dev/null 2>&1
set +a

与Oh-my-Zsh的dotenv插件非常好的交叉兼容。(有Oh-my-bash,但它没有dotenv插件。)

我的要求是:

简单的.env文件,没有导出前缀(为了与dotenv兼容) 支持值在引号中:TEXT="alpha bravo charlie" 支持以#和空行作为前缀的注释 通用的mac/BSD和linux/GNU

完整的工作版本编译自上述答案:

  set -o allexport
  eval $(grep -v '^#' .env | sed 's/^/export /')
  set +o allexport