在 bash 脚本中使用 .env 属性

Jon*_*bek 5 deployment bash scripting pm2

我有一个服务器应用程序,有两个部署,一个用于临时环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件来合并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
Run Code Online (Sandbox Code Playgroud)

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

.env

NODE_ENV=staging
Run Code Online (Sandbox Code Playgroud)

最终我想做一些类似的事情

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
Run Code Online (Sandbox Code Playgroud)

很明显,我在 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
Run Code Online (Sandbox Code Playgroud)

Aks*_*arg 4

你可以的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
Run Code Online (Sandbox Code Playgroud)