Using chown $USER:$USER inside bash script

In a small bash script I’m running I am attempting to chown a new directory that is created. I’ve added:

sudo chown $USER:$USER /var/www/$sitename
sudo chmod 775 /var/www/$sitename

after the line where I mkdir (sudo mkdir /var/www/$sitename).

For some reason the chown is not executing. I can execute it manually but when written in the file it doesn’t work. I have noticed that “chown” is not highlighted in the same color as “mkdir” and “chmod” but I can’t figure out my problem.

Why doesn’t chown work here?

Is it an issue with $USER:$USER?

EDIT
Here is the full script. How would I chown the file to whichever non root user executed the script?

#!/bin/sh
#!/bin/bash
# New Site

cd /etc/apache2/sites-available/
echo "New site name (test.my):"
read sitename
echo "<VirtualHost *:80>

        ServerAdmin admin@$sitename

    ServerName $sitename

        ServerAlias $sitename

    DocumentRoot /var/www/$sitename

        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/$sitename>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


</VirtualHost>" > $sitename.conf
sudo mkdir /var/www/$sitename
sudo chown $USER:$USER /var/www/$sitename
echo USER is $USER
sudo chmod 775 /var/www/$sitename
sudo a2ensite $sitename.conf
sudo apachectl restart
echo "New site created"
Asked By: BrassApparatus

||

If for some reason, $USER is not set, you can use the id command to obtain the identity of the real user. So the first time you use the $USER variable, you can use the shell expansion to supply a default value. Change the chown line in your script to:

sudo chown "${USER:=$(/usr/bin/id -run)}:$USER" "/var/www/$sitename"

If USER is empty or unset when this is run, bash will set the USER variable to the output of /usr/bin/id -run.

Answered By: Tim Cutts

In order to simplify the problem and since your are getting the variable sitename, why don’t you read a username variable?

With that you’d make sure that the script execution is not dependent on the environmental variables made available the way the script is executed.

Answered By: marram

There is only a tiny fault I think. sudo opens a new shell for executing the command and after sudo the user is root. So maybe you should use something like this:

MYUSER=$USER

sudo chown $MYUSER:$MYUSER

as i think MYUSER is not systemspezific overwritten and shall work.

Answered By: Andreas Bartels

When I calling my script with sudo it would set $USER to root.

$ sudo ./myscript.sh

I tried the chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename but it would still return root.

I found if I used who with awk I was able to get the current user that called the script with sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Answered By: Eric James Deiter

The accepted answer by @tim-cutts would not work if you call the script itself with sudo:

sudo ./myscript.sh

A more simple version of this answer would be to use logname:

curuser=$(logname)
chown $curuser:$curuser /var/www/$sitename
Answered By: Hogcryat