Linux – sudo, runuser, su don’t work as I expect when run as root with command as “echo $HOME”

bashenvironment-variableslinuxsusudo

When I run these commands it outputs as shown. /root

$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root    
$ su - someuser -c "echo $HOME"
/root

What i expected was

/home/someuser

When I run the env command to inspect the environment It reports the HOME variable correctly.

$ su - someuser -c "env"
...  
HOME=/home/someuser
...

$ sudo -u someuser -i "env"  
...  
HOME=/home/someuser
...

$ runuser -l someuser -c "env"  
...  
HOME=/home/someuser
...  

What I want to do is run scripts under the users home directory. /home/someuser/scripts.
as ${HOME}/scripts/somescript.sh

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found  

What i expected was:

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
...
script output.
...

Best Answer

Tangentially related:

sudo -u someuser -i "echo $HOME"

doesn't work at all for me. It says:

-bash: echo $HOME: command not found

To the point: When you execute the command

sudo -u someuser -i echo $HOME

the variable $HOME gets expanded by the shell before sudo gets even executed.

To solve this, you could use a command like

sudo -u someuser -i bash -c 'echo $HOME'

In this command, echo $HOME gets sent literally to bash after switching the UID.

The result is as expected:

/home/someuser
Related Question