Bash

帶有變數替換的 Eval 和 exec

  • February 5, 2019

我想執行一個語句來啟動一個伺服器。為此,我有一個環境變數來確定要啟動哪個伺服器。我得到了這個命令作為起點:

eval "exec gunicorn --chdir /this/dir package.sub:call_main() -b 0.0.0.0:80"

由於我有幾種伺服器要啟動,我想參數化腳本。在搜尋之後,我發現引用是多餘的。所以我現在擁有的是:

APP=main
eval exec gunicorn --chdir /this/dir package.sub:call_${APP}() -b 0.0.0.0:80

然而,這會產生一個syntax error near unexpected token '('. 理想情況下,我什至希望有一個預設參數,例如${APP:-main},但我想一旦語法錯誤問題得到解決,這是可能的。

上面的陳述有什麼問題?此外,這裡是否需要eval甚至exec需要?

在您的第二段程式碼中,您刪除了eval. 不要那樣做。刪除它們會對()shell 產生特殊影響(它會啟動一個子 shell)。

反而:

app=main
eval "exec gunicorn --chdir /this/dir package.sub:call_$app'()' -b 0.0.0.0:80"

括號仍然必須在此處引用,以eval重新評估字元串。$app變數擴展將在呼叫之前完成eval

或者,

app=main
eval "exec gunicorn --chdir /this/dir 'package.sub:call_$app()' -b 0.0.0.0:80"

這可能看起來更好。

請注意${APP}$APP在所有方面都是相同的,除非緊跟在變數名中有效的字元(如"${APP}x")中。在這裡,{...}不需要。此外,使用小寫變數名稱以避免與現有環境變數發生意外衝突。

我認為這裡不需要evalexec不需要。該字元串似乎不需要重新評估,並將eval替換目前的 shell 程序(我不知道這是否是你想要的)。exec``gunicorn

這可能就足夠了

app=main
gunicorn --chdir /this/dir "package.sub:call_$app()" -b 0.0.0.0:80

注意雙引號。

有關的:

引用自:https://unix.stackexchange.com/questions/498745