This is really a question for unix and linux . But nonetheless: No , systemd will not expand the environment variable inside Environment= . From 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".
As you can see from the example in the $word documentation, it simply means $word , the extension will not be executed. Qualifiers that man is talking about is %i , %n , %u , etc. They are in man systemd.unit (under their own man ).
ExecStart= and its derivatives, ExecStart= other hand, will expand the environment variable . Using environment variables in ExecStart= is a common workaround for additional environment variables in systemd . I believe that this is also one of the reasons why so many recent programs accept the same parameters from the environment and from command line parameters.
Extension example in ExecStart= , from 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 has its own documentation distributed over several man , but they get used to them after a while.