在 bash 脚本中使用 .env 属性
using .env property in bash script
我有一个服务器应用程序有两个部署,一个用于暂存环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件将 start_production.sh
和 start_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"
双引号变量替换。
您的示例代码的更大问题是无关的 echo
s。例如,
pm2 delete echo $ENVIRONMENT
不需要echo
。 “echo”将成为命令的一部分 运行。 shell 不需要替换那里的变量。
结合这两个修复我们得到
pm2 delete "$ENVIRONMENT"
应该效果不错。
我有一个服务器应用程序有两个部署,一个用于暂存环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件将 start_production.sh
和 start_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" 双引号变量替换。
您的示例代码的更大问题是无关的 echo
s。例如,
pm2 delete echo $ENVIRONMENT
不需要echo
。 “echo”将成为命令的一部分 运行。 shell 不需要替换那里的变量。
结合这两个修复我们得到
pm2 delete "$ENVIRONMENT"
应该效果不错。