22

I am trying to use the $HOME environment variable in the ExecStart. I tried many different things like $HOME and ${HOME} but nothing seems to be working

ExecStart=${HOME}/bin/some-binary

Anyone knows the correct format for this?

Keeto
  • 351
  • 1
  • 2
  • 5

3 Answers3

25

I think this is what you're looking for: https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers.

Specifically, %h should expand to the current user's home dir.

Jack O'Connor
  • 591
  • 1
  • 6
  • 9
  • According to the documentation you have provided, `%h` is the `user home directory`. But, in my case, `ExecStart` still requested the full path so I ended up typing it starting from the root. – Can Sürmeli Nov 15 '19 at 09:06
  • Using `%h` is probably not what you want. I've posted an alternate answer with details. – pR0Ps Jan 04 '20 at 11:20
10

The full list of supported variables (called "Specifiers") is here: https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers.

There is no specifier for the home directory of user the service is run as (the one specified by User=). There is only one for the user running the service manager.

From the link:

%h is the home directory of the user running the service manager instance. In case of the system manager this resolves to "/root". Note that this setting is not influenced by the User= setting configurable in the [Service] section of the service unit.

pR0Ps
  • 235
  • 2
  • 7
  • 4
    Just to be clear, that means if I have a user unit, then `%h` most definitely is what I want to use because it will give me the equivalent of `$HOME`. – Cliff Apr 22 '20 at 20:05
  • 1
    Can confirm. %h resolves to $HOME for --user services. – Karl Pokus Apr 24 '21 at 21:21
0

You could use

WorkingDirectory=~

and set relative paths.