サーバーを起動するステートメントを実行したいと思います。これには、起動するサーバーを決定する環境変数があります。私は次のコマンドを出発点にしました。
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
ベストアンサー1
2番目のコードでは、パラメータの周りの二重引用符を削除しましたeval
。しないでください。これを削除すると、()
シェルが特別になります(サブシェルが起動します)。
代わりに:
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
再評価する必要はないようです。exec
変える現在のシェルプロセスgunicorn
(これがあなたが望むものかどうかわかりません)。
十分かもしれない
app=main
gunicorn --chdir /this/dir "package.sub:call_$app()" -b 0.0.0.0:80
二重引用符に注意してください。
関連: