首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将环境变量从文件传递到节点命令

如何将环境变量从文件传递到节点命令
EN

Stack Overflow用户
提问于 2019-05-07 00:10:27
回答 1查看 1.5K关注 0票数 1

我已经通过npm (db-migrate)安装了一个命令。作为自动化数据库迁移的一部分,我希望从命令行运行它。脚本的配置文件可以引用环境变量。我已经将数据库凭据设置为另一个文件中的环境变量。因此,我没有两次设置它们,而是告诉迁移配置使用环境变量。问题是,在运行迁移脚本之前,如何从文件中获取环境变量?此外,如何从npm bin直接运行迁移脚本?

我找到了一个很好的解决这个问题的方法,所以我张贴这个问题和答案,至少是为了我未来的自我利益。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-07 00:10:27

这可以使用几个工具来完成:

  1. 从文件中读取环境变量,并在运行脚本之前设置它们。要查看,在运行命令之前设置一个环境变量很简单:
代码语言:javascript
运行
复制
PORT=3000 node index.js

但是我们想从文件中读取变量。这可以使用exportxargs来完成。

代码语言:javascript
运行
复制
export $(cat app.env | xargs)
  1. 我们想直接从npm的bin运行脚本。bin文件夹的路径可以使用npm bin获得。因此,我们只需要在运行命令之前将其添加到路径中:
代码语言:javascript
运行
复制
PATH=$(npm bin):$PATH
  1. 现在把它们放在一起:
代码语言:javascript
运行
复制
export $(cat app.env | xargs) && PATH=$(npm bin):$PATH db-migrate up

这将读取环境变量,设置它们,将npm bin添加到路径中,然后运行迁移脚本。

顺便说一下,app.env的内容应该如下所示:

代码语言:javascript
运行
复制
PORT=3000
DB_NAME=dev
DB_USER=dev_user
DB_PASS=dev_pass

更新:

这种方法有几个注意事项。首先,它将使用环境变量污染当前的shell。换句话说,在运行export...xargs位之后,您可以运行类似于echo $DB_PASS的内容,您的密码就会显示出来。若要防止这种情况,请将命令包装为parens:

代码语言:javascript
运行
复制
(export $(cat app.env | xargs) && PATH=$(npm bin):$PATH db-migrate up)

parens导致在子subshell环境中执行命令。环境变量不会冒泡到当前的shell。

第二个警告是,只有当环境变量中没有空格时,这才能起作用。如果您想要空格,我找到了一个基于这个重要的评论的OK解决方案。创建一个名为load-env.sh的文件

代码语言:javascript
运行
复制
# loads/exports env variables from a file
# taken from: https://gist.github.com/judy2k/7656bfe3b322d669ef75364a46327836#gistcomment-3239799
function loadEnv() {
    local envFile=$1
    local isComment='^[[:space:]]*#'
    local isBlank='^[[:space:]]*$'
    while IFS= read -r line; do
        [[ $line =~ $isComment ]] && continue
        [[ $line =~ $isBlank ]] && continue
        key=$(echo "$line" | cut -d '=' -f 1)
        value=$(echo "$line" | cut -d '=' -f 2-)
        eval "export ${key}=\"$(echo \${value})\""
    done < "$envFile"
}

然后像这样运行命令:

代码语言:javascript
运行
复制
(source scripts/load-env.sh && loadEnv app.env && PATH=$(npm bin):$PATH db-migrate up)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56013874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档