Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have two servers, they're identical (I believe), production and staging servers.

And I have upstart script in /etc/init/ folder.

description "Discoure process"

setuid deploy
setgid deploy

respawn limit 3 30

start on runlevel [2345]
stop on runlevel [06]

exec /bin/bash <<'EOT'
  echo \"$HOME/.rbenv\"

  cd /home/deploy/discourse/current

  bundle exec bluepill load config/discourse.pill --no-privileged --base-dir tmp/bluepill --logfile log/bluepill.log
end script

On the staging server it works well, but when I'm running that script on production server then the HOME variable is empty, the code echo "$HOME/.rbenv" is evaluating to "/.rbenv"

What might be a problem here? Thanks

share|improve this question
I don't know the root cause, but why not set it first, statically though? – i08in Dec 20 '13 at 10:15
Why the cumbersome bash script? It looks like (da)sh would interpret it perfectly fine. – David Foerster Dec 21 '13 at 19:29
up vote 10 down vote accepted

Read this question on and this answer by user grawity on

You should not use $HOME in init.d, because it is not clear which users home to use, until this user logs in.

Quote from POSIX specification:

The system shall initialize this variable at the time of login to be a pathname
of the user's home directory. See <pwd.h>.

You can use little hack, to get home folder of user myuser in your script

su - myuser -c /usr/bin/env | grep HOME

It is better to use script below, because usually there can be other HOME_* folders. Such as JAVA_HOME etc.

su - myuser -c /usr/bin/env | grep "^HOME="
share|improve this answer

Seems like the $HOME is being interpreted before it goes to bash? I would try one of the following. Either add:

env HOME=/home/MyName

to the code just after the description.

Or move the code from inside the script block to another script file with:

#! /bin/bash

as line 1. Then have

exec /path/to/my/
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.