Bash: export .env variables

12 浏览
0 Comments

Bash: export .env variables

假设我有一个包含以下内容的.env文件:

USERNAME=ABC
PASSWORD=PASS

与正常的.env文件不同,这些行没有前缀export,因此我不能直接源化该文件。

创建一个加载.env文件内容并将其设置为环境变量的shell脚本的最简单方法是什么?

0
0 Comments

Bash: export .env variables

在使用Bash脚本时,有时我们需要从一个文件中导入环境变量(如配置文件),然后将其导出为环境变量,以便在整个脚本中使用。这个问题的出现可能有两种情况,下面分别进行解释和解决方法:

如果你的行是有效的、受信任的Shell命令,但是对于export命令而言有问题

这种情况下需要进行适当的Shell引用。如果你的行是像foo='bar baz'这样的,那么你是正确的;但是如果你的行是像foo=bar baz这样的,就会出现问题。

解决方法如下:

set -a # 自动导出所有变量
source .env
set +a


如果你的行不是有效的Shell命令

下面的代码是用来读取键值对的,不需要或者不识别Shell引用。

解决方法如下:

while IFS== read -r key value; do
  printf -v "$key" %s "$value" && export "$key"
done <.env

在这种解决方法中,只需要运行source .env就可以了,只要确保你的.env文件中的值没有空格。

另外,如果你不使用set -a或者export,那么变量只会在当前的Shell环境中生效,而不会传递给子进程。所以,如果需要设置环境变量,而不是Shell变量,就需要使用export命令。

还有一个使用.env文件来设置环境变量的方法如下:

while IFS== read -r key value; do key=`echo $key | sed 's/ *$//g'`; value=`echo $value | sed 's/ *$//g'`; export "$key"="$value"; eval "echo $key = \${$key}"; done < .env

但是这段代码有很多错误,不建议使用。echo $keyecho $value本身就有问题,如果你的值中包含*,就可能会导致文件名列表的出现。此外,还有更高效的解决方法,与使用外部命令相比,在命令替换和运行外部命令时效率更高。

如果你有其他问题,请参考上述解决方法进行修复。

0
0 Comments

Bash: export .env variables的问题出现的原因是代码中存在一些不兼容的语法和不规范的写法。解决这个问题的方法是修复代码中的语法错误和不规范写法。

在给定的代码中,load_dotenv()函数的实现存在以下问题:

1. 在使用source命令加载.env文件时,使用了错误的语法<("$1" | sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")。正确的语法应该是< <("$1" | sed -e '/^#/d;/^[[:space:]]*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")。

2. 在设置变量的值之前,没有使用set -a命令启用自动导出变量的功能,导致变量无法正确导出。

3. 在加载完.env文件后,没有使用set +a命令关闭自动导出变量的功能。

为了解决这些问题,可以进行以下修改:

load_dotenv(){
  # https://stackoverflow.com/a/66118031/134904
  # Note: you might need to replace "\s" with "[[:space:]]"
  source < <("$1" | sed -e '/^#/d;/^[[:space:]]*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")
}
set -a
[ -f "test.env" ] && load_dotenv "test.env"
set +a

另外,如果使用了direnv工具,可以直接在.envrc文件中添加以下代码来实现.env文件的加载:

[ -f "test.env" ] && dotenv "test.env"

需要注意的是,原始代码中的cat $1 | ...语句在处理文件名中包含空格或通配符的情况下会出现问题,正确的做法是使用cat -- "$1" | ...或者<"$1" ...来解决。此外,在sed表达式中使用\s也是一个不可移植的扩展,应该使用[[:space:]]来保持与标准POSIX sed的兼容性。另外,关于function关键字的使用,应该遵循推荐的写法load_dotenv() {,而不是使用function关键字。

更多关于这些问题的信息可以参考以下链接:

- https://wiki.bash-hackers.org/scripting/obsolete

0
0 Comments

问题的出现的原因是,使用export $(xargs <.env)将.env文件中的所有内容导出时,如果环境值中存在空白字符,则会导致错误。在这种情况下,命令将尝试导出一个名为words的已存在的变量,而words实际上应该是password的一部分。

要解决这个问题,可以使用export $(xargs -L 1 <.env)命令。这个命令将每行的内容作为独立的参数传递给export命令,避免了空白字符导致的错误。

另外,为了避免记住set -axargs的细节,建议将一个函数添加到配置文件中,用于导出.env文件中的变量。这样可以方便地调用该函数,而不需要记住具体的命令。

问题的解决方法是使用export $(xargs -L 1 <.env)命令来导出.env文件中的变量,并将该命令添加到配置文件中作为一个函数,以便在需要时进行调用。

0