Bash: export .env variables
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 $key
和echo $value
本身就有问题,如果你的值中包含*
,就可能会导致文件名列表的出现。此外,还有更高效的解决方法,与使用外部命令相比,在命令替换和运行外部命令时效率更高。
如果你有其他问题,请参考上述解决方法进行修复。
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
关键字。
更多关于这些问题的信息可以参考以下链接:
问题的出现的原因是,使用export $(xargs <.env)
将.env文件中的所有内容导出时,如果环境值中存在空白字符,则会导致错误。在这种情况下,命令将尝试导出一个名为words
的已存在的变量,而words
实际上应该是password
的一部分。
要解决这个问题,可以使用export $(xargs -L 1 <.env)
命令。这个命令将每行的内容作为独立的参数传递给export
命令,避免了空白字符导致的错误。
另外,为了避免记住set -a
和xargs
的细节,建议将一个函数添加到配置文件中,用于导出.env文件中的变量。这样可以方便地调用该函数,而不需要记住具体的命令。
问题的解决方法是使用export $(xargs -L 1 <.env)
命令来导出.env文件中的变量,并将该命令添加到配置文件中作为一个函数,以便在需要时进行调用。