web-dev-qa-db-ja.com

Systemdで他の環境変数を参照する

Systemdで新しい環境変数を設定するときに他の環境変数を参照することは可能ですか?

[Service]
EnvironmentFile=/etc/environment
Environment=HOSTNAME=$COREOS_PRIVATE_IPV4
Environment=IP=$COREOS_PRIVATE_IPV4
Environment=FELIX_FELIXHOSTNAME=$COREOS_PRIVATE_IPV4

上記のコードは機能していないようです。

13
Jason Waldrip

これは本当に nix&linux の質問です。ただし、それでも:NosystemdEnvironment=内で環境変数の展開を実行しません。 man systemd.execから:

   Environment=
       Sets environment variables for executed processes. Takes a space-separated list of variable assignments. This
       option may be specified more than once, in which case all listed variables will be set. If the same variable is
       set twice, the later setting will override the earlier setting. If the empty string is assigned to this option,
       the list of environment variables is reset, all prior assignments have no effect. Variable expansion is not
       performed inside the strings, however, specifier expansion is possible. The $ character has no special meaning.
       If you need to assign a value containing spaces to a variable, use double quotes (") for the assignment.

       Example:

           Environment="VAR1=Word1 Word2" VAR2=Word3 "VAR3=$Word 5 6"

       gives three variables "VAR1", "VAR2", "VAR3" with the values "Word1 Word2", "Word3", "$Word 5 6".

ドキュメントの例からわかるように、$Wordは単に$Wordを意味します。展開は実行されません。 manが話している指定子は、%i%n%u、など。それらはman systemd.unitにあります(独自のmanセクションの下)。


一方、ExecStart=とその派生物は、環境変数の展開を実行します。 ExecStart=で環境変数を使用することは、systemdの追加の環境変数の一般的な回避策です。私believe、それはまたの1つであり、最近の多くのプログラムが環境とコマンドラインから同じパラメーターを受け入れる理由です。パラメーター。

ExecStart=からのman systemd.serviceの拡張の例:

   Example:

       Environment="ONE=one" 'TWO=two two'
       ExecStart=/bin/echo $ONE $TWO ${TWO}

   This will execute /bin/echo with four arguments: "one", "two", "two", and "two two".

   Example:

       Environment=ONE='one' "TWO='two two' too" THREE=
       ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
       ExecStart=/bin/echo $ONE $TWO $THREE

   This results in echo being called twice, the first time with arguments "'one'", "'two two' too", "", and the second
   time with arguments "one", "two two", "too".

systemdのドキュメントはいくつかのmanに分散していますが、しばらくすると慣れてきます。

14
grochmal