【问题标题】:using .env property in bash script在 bash 脚本中使用 .env 属性
【发布时间】:2021-08-23 07:35:25
【问题描述】:

我有一个服务器应用程序,它有两个部署,一个用于暂存环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件将start_production.shstart_staging.sh合并到start.sh中。

start_production.sh

#!/bin/bash
pm2 delete production
pm2 start "npm run build && npm run start:prod" --name production --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs

检查内容,两个脚本之间的唯一区别是进程名称空间应该始终对应于环境文件。这将使其成为加载 .env 属性 NODE_ENV 的理想选择

.env

NODE_ENV=staging

最终我想做类似的事情

start.sh

#!/bin/bash
ENVIRONMENT={read NODE_ENV content of .env}
pm2 delete echo $ENVIRONMENT
pm2 start "npm run build && npm run start:prod" --name echo $ENVIRONMENT --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs

很明显,我在 bash 脚本方面绝对是个新手,所以我希望得到一个尽可能具体的答案。

解决方案

我将提供一个基于两个当前答案的聚合解决方案

start.sh

#!/bin/bash
source .env
ENVIRONMENT="$NODE_ENV"
if [ "$ENVIRONMENT" != "production" ] && [ "$ENVIRONMENT" != "staging" ]; then
    echo "improper .env NODE_ENV"
    exit
fi
pm2 delete "$ENVIRONMENT"
pm2 start "npm run build && npm run start:prod" --name "$ENVIRONMENT" --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs

【问题讨论】:

    标签: bash deployment scripting pm2


    【解决方案1】:

    您可以source .env 文件。因为KEY=value 格式与 bash 处理其环境变量的方式兼容。所以在你的情况下,start.sh 会是

    #!/bin/bash
    source .env
    
    pm2 delete echo $NODE_ENV
    pm2 start "npm run build && npm run start:prod" --name $NODE_ENV --log-date-format 'DD-MM HH:mm:ss.SSS'
    pm2 logs
    

    【讨论】:

    • 它会创建一个名为 echo 的进程,而不是回显 $NODE_ENV
    • 如果您从命令中删除回显,我将标记为答案:)
    • 移除了回声
    【解决方案2】:

    Akshit 关于采购.env 文件的建议很好。我注意到您的 shell 代码还有其他一些问题。

    首先值得注意的是,它是一个"best practice" 双引号你的变量替换。

    您的示例代码更大的问题是无关的echos。例如,

    pm2 delete echo $ENVIRONMENT
    

    那里不需要echo。 “回声”将成为正在运行的命令的一部分。 shell不需要替换那里的变量。

    结合我们得到的这两个修复

    pm2 delete "$ENVIRONMENT"
    

    应该很好用。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2014-03-02
      • 2021-12-21
      • 2021-04-01
      • 2019-11-16
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多