在 bash 脚本中使用 chown $USER:$USER

Bra*_*tus 11 bash terminal shell-script gnome-terminal chown

在我正在运行的一个小 bash 脚本中,我试图创建一个新目录。我已经添加:

sudo chown $USER:$USER /var/www/$sitename
sudo chmod 775 /var/www/$sitename
Run Code Online (Sandbox Code Playgroud)

在我 mkdir ( sudo mkdir /var/www/$sitename)所在的行之后。

由于某种原因,chown 没有执行。我可以手动执行它,但是当写入文件时它不起作用。我注意到“chown”没有以与“mkdir”和“chmod”相同的颜色突出显示,但我无法弄清楚我的问题。

为什么 chown 不在这里工作?

有问题$USER:$USER吗?

编辑 这是完整的脚本。我如何将文件 chown 给执行脚本的任何非 root 用户?

#!/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"
Run Code Online (Sandbox Code Playgroud)

Tim*_*tts 9

如果由于某种原因$USER未设置,则可以使用该id命令获取真实用户的身份。因此,第一次使用该$USER变量时,可以使用 shell 扩展来提供默认值。chown将脚本中的行更改为:

sudo chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
Run Code Online (Sandbox Code Playgroud)

如果USER在运行时为空或未设置,bash 会将USER变量设置为/usr/bin/id -run


小智 5

当我用它调用我的脚本时,sudo它将设置$USER为 root。

$ sudo ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

我尝试过,chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename但它仍然会返回root。

我发现如果我使用whowithawk我能够获取使用 调用脚本的当前用户sudo

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Run Code Online (Sandbox Code Playgroud)