在 bash 脚本中使用 .env 属性

using .env property in bash script

我有一个服务器应用程序有两个部署,一个用于暂存环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件将 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

您可以 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

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

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

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

pm2 delete echo $ENVIRONMENT

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

结合这两个修复我们得到

pm2 delete "$ENVIRONMENT"

应该效果不错。