![](/img/trans.png)
[英]How can I set environment variables from Heroku for a single bash command, not for the whole shell session?
[英]How can I support comments when eval'ing a file to set environment variables for a single command?
我正在使用一個文件variables.env
的項目,並添加VAR_THREE
並對其進行注釋,如下所示:
VAR_ONE=val1
VAR_TWO=val2
# comment the purpose of the new variable
VAR_THREE=val3
在命令行中,我運行它來設置變量並啟動程序(通過項目中現有的shell腳本運行):
eval $(cat variables.env) java -jar my.jar
此注釋似乎適用於所有之后的內容,包括java
命令,這可以通過檢查echo $VAR_THREE
沒有值來明顯看出,而我的.jar也沒有輸出。 如果我對variables.env
保留我的注釋, VAR_THREE
設置VAR_THREE
,程序將運行並產生輸出。
有沒有辦法允許變量文件中的注釋不應用於后續行和命令?
簡單的事情是使用子外殼。
(set -a; . variables.env; exec java -jar my.jar)
要將其分解為各個組成部分:
( ... )
將整個代碼放在一個subshell內-用fork()
創建的shell副本,但是沒有exec
-family調用-因此,所有變量都不會在其完成之后持續存在。 set -a
告訴外殼程序將所有變量自動導出到環境中(這樣它們將對java
子進程可見)。 由於存在子外殼程序,因此其范圍仍然僅限於此處運行的代碼。 . variables.env
. variables.env
是一個更便攜相當於source variables.env
,運行的內容variables.env
為腳本。 exec
告訴已經存在的子shell用java
可執行文件替換自身 。 如果沒有exec
(缺少某些特定於場景/未記錄的運行時優化),則運行外部命令將創建一個新的子shell,告訴新的子shell用java
可執行文件替換自身,然后等待新的子shell退出; 通過運行exec java
,我們將使用已經完成的子shell,而不是創建第二個。 ...還有一個額外的好處,您不會得到eval
的不良副作用(在傳遞包含空格或其他語法敏感字符的參數時,會引起額外的字符串拆分,glob擴展以及其他潛在的混亂) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.