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


14

私が使用しようとしています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

私は何が欠けていますか?

回答:


27

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ではないためです。の/bin/sh代わりにbashを使用することにより、不要な依存関係がなくなりbashます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.