簡體   English   中英

在 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

您可以.env source 由於格式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 代碼存在其他幾個問題。

首先值得注意的是,將變量替換雙引號是“最佳實踐”

您的示例代碼的更大問題是無關的echo 例如,

pm2 delete echo $ENVIRONMENT

不需要那里的echo “回聲”將成為正在運行的命令的一部分。 shell 不需要替換那里的變量。

結合我們得到的這兩個修復

pm2 delete "$ENVIRONMENT"

這應該運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM