簡體   English   中英

評估文件以為單個命令設置環境變量時如何支持注釋?

[英]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)

要將其分解為各個組成部分:

  • ( ... )將整個代碼放在一個subshel​​l內-用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.

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