web-dev-qa-db-ja.com

systemdサービスファイル内でbashパラメーターの展開が機能しないのはなぜですか?

systemdEnvironmentFileを使用して、ファイルに設定されているコマンドにオプションを追加しようとしています。ユニットファイルには次のものが含まれています。

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

サービスを開始しても何も表示されません。

以下は期待どおりに機能します。

ExecStart=/usr/bin/bash -c "echo port is $PORT"

つまり、ファイルは正しく読み取られます。

パラメータ置換はコマンドラインでも機能します。

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

何が欠けていますか?

14
Lev Levitsky

systemdは独自の最小限のシェルスタイルのコマンドライン解析を行いますExecStart=およびその他のパラメーターの内容。この最小限の解析は、基本的な環境変数の置換をサポートしていますが、${PORT:+port is $PORT}のようなものではないようです。

Systemdがそれを行わないようにし、呼び出されたシェルにそれを処理させたい場合があります。

ドキュメントから:

リテラルのドル記号を渡すには、「$$」を使用します。

だからこれを試してください:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

またはもっと良いのは、これを試してください:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

ここで行う変数展開のタイプはPOSIX標準であり、bash-ismではありません。 bashの代わりに/bin/shを使用することで、bashへの不要な依存関係を取り除くことができます。

27
Celada