31

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?

2
  • 3
    This is not allowed in ExecStart=. It must be a full path beginning with a /. Aug 4, 2016 at 19:37
  • 1
    If you want a service to use things in every user's homes, you want a user service, not a system service.
    – bviktor
    Jan 4, 2020 at 11:52

4 Answers 4

31

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.

2
  • 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. Nov 15, 2019 at 9:06
  • Using %h is probably not what you want. I've posted an alternate answer with details.
    – pR0Ps
    Jan 4, 2020 at 11:20
13

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.

2
  • 5
    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, 2020 at 20:05
  • 1
    Can confirm. %h resolves to $HOME for --user services.
    – Karl Pokus
    Apr 24, 2021 at 21:21
1

You could use

WorkingDirectory=~

and set relative paths.

0

So, as the absence of practical examples in combination with comments makes a feeling like %h doesn't work (it does actually), here's a full example of a service that starts from HOME dir without hardcoding it.

Given a script ~/test.sh:

#!/bin/bash
echo hello

Creating a file ~/.config/systemd/user/test.service:

[Unit]
Description=Test

[Service]
Type=oneshot
ExecStart=%h/test.sh

[Install]
WantedBy=multi-user.target

then executing a systemctl --user daemon-reload && systemctl --user start test will make it start and print Hello to the journal.

It uses the %h specifier mentioned in other answers and documented as a This is the home directory of the user running the service manager instance. […]. So unless you'll run your user service as another user, this should work.

Systemd versions tested:

  • systemd 253 (253.1-3-arch)
  • systemd 237.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .