The Issue of the Day Before

在 shell script 中載入 .env

shell -
[ ! -f .env ] || export $(grep -v '^#' .env | sed 's/\r$//' | xargs)

Why

雖然不是必要但有時想使用外部檔案來載入環境參數。

How

[ ! -f .env ] || export $(grep -v '^#' .env | sed 's/\r$//' | xargs)
echo "load .env: "
printenv

[ ! -f .env ] 是檢查 .env 這檔案存不存在。

grep -v '^#' .env 取出 .env 檔案中不是註解的行。 shell script 中以 # 開頭是註解。

sed 's/\r$//' 將前面的結果給 sed 處理,去掉換行。

需要這樣處理的原因是

\rASCII 十進位中是 15 指的是 Enter 鍵,原來是代表指示打字機托架(carriage)返回到最右側。

\nASCII 十進位中是 12 指的是 New Line (新行)。

Window/Dos 中換行的指示是 \r\n,而其他系統使用 \n。故需要去掉 \r 避免載入的變數結尾多出 \r

最後透過 xargs 將每一行 echoexport ,等同 export name[=value]

export 會將區域變數成為廣域變數,等同在整個 shell script 中都能使用該變數。

不信,可以試試用 printenv 將所有環境變數印出。

閱讀在雲端