#File: /home/miles/temp/foo.env
ONE=/one
TWO=${ONE}/two
FULL_PATH=${TWO}/three
#File: ~/.config/systemd/user/foo.service
[Service]
EnvironmentFile=/home/miles/temp/foo.env
# prints ${TWO}/three
# ExecStart=/bin/sh -c 'echo $FULL_PATH'
# prints ${ONE}/two/three
ExecStart=/bin/sh -c 'echo ${FULL_PATH}'
任意のネストレベルに変数を拡張する方法はありますか?
拡張のみ可能です。二つ深い。
変数の周りに中かっこを追加すると、さらに1つのレベル
FULL_PATH
が拡張されるのはなぜですか?この場合、中かっこがオプションであれば幸いです。
拡張するパラメータ名または記号は中括弧で囲むことができます。これはオプションですが、名前の一部として解釈できる直後の文字から拡張される変数を保護するために使用されます。
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
systemdでは、中かっこはスペースから単語が分離されるのを防ぐために見えますが、これは重要ではありません。
コマンドラインで単語の一部として使用される
"${FOO}"
場合、または独自の単語として使用されている場合は、削除され、環境変数(存在する場合)(含まれるスペースを含む)の正確な値に置き換えられます。これは常に結果です。まさに1つのパラメータとして。コマンドラインで"$FOO"
別の単語として使用されます。この場合、スペースで分割された環境変数の値に置き換えられます。https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#Command%20lines
ベストアンサー1
ここで重要な点は少し微妙ですが、引用した文書に記載されています。
使用」
${FOO}
"言葉の一部として、またはそれ自体の言葉で、
使用」
$FOO
"別の言葉で
$FOO
単独で単語として使用する場合にのみ拡張されますが、引用符で囲まれた文字列は1単語です。したがって、その$FOO
文字列$FOO
に'$FOO'
.中括弧を使用すると、他のテキストを含む引用符付き文字列内でのみ拡張が発生します。"$FOO"
"something $FOO"
${FOO}
/bin/sh -c 'echo ${TWO}/three'
したがって、皆さんが見ているの${FULL_PATH}
は。/bin/sh -c 'echo $FULL_PATH'
$FULL_PATH
どちらの場合も、再帰変数拡張を実行するコンポーネントはありません。ある場合は、systemd${FULL_PATH}
がに置き換えられ、${TWO}/three
シェルが拡張されます${TWO}
。 2番目のケースでは、代わりにsystemdが置き換えられ、シェルが拡張されます$FULL_PATH
。変数を再帰的に安全に拡張する方法がわかりません。