Bash
帶有變數替換的 Eval 和 exec
我想執行一個語句來啟動一個伺服器。為此,我有一個環境變數來確定要啟動哪個伺服器。我得到了這個命令作為起點:
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"
)中。在這裡,{...}
不需要。此外,使用小寫變數名稱以避免與現有環境變數發生意外衝突。我認為這裡不需要
eval
或exec
不需要。該字元串似乎不需要重新評估,並將eval
替換目前的 shell 程序(我不知道這是否是你想要的)。exec``gunicorn
這可能就足夠了
app=main gunicorn --chdir /this/dir "package.sub:call_$app()" -b 0.0.0.0:80
注意雙引號。
有關的: