システムサービスファイルでbashパラメータ拡張が機能しないのはなぜですか?

システムサービスファイルでbashパラメータ拡張が機能しないのはなぜですか?

ファイルで設定するときにsystemd'を使用し、コマンドにオプションを追加しようとしています。EnvironmentFile私のユニットファイルには次のものがあります。

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

私は何を見逃していますか?

答え1

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}"

ここで実行する変数拡張型は、bash-ismではなくPOSIX標準であるためです。/bin/sh代わりに、あなたのbash不要な依存関係を排除することができますbash

関連情報