bash 스크립트 내에서 chown $ USER : $ USER 사용 AllowOverride All

작은 bash 스크립트에서 내가 실행중인 새 디렉토리를 만들려고합니다. 나는 추가했다 :

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

내가 mkdir ( sudo mkdir /var/www/$sitename) 줄 다음에 .

어떤 이유로 chown이 실행되고 있지 않습니다. 수동으로 실행할 수는 있지만 파일에 쓰면 작동하지 않습니다. “chown”이 “mkdir”및 “chmod”와 같은 색으로 강조 표시되지 않았지만 문제를 파악할 수 없습니다.

왜 chown이 작동하지 않습니까?

문제가 $USER:$USER있습니까?

편집
여기에 전체 스크립트가 있습니다. 루트가 아닌 사용자가 스크립트를 실행 한 파일을 어떻게 chown합니까?

#!/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"


답변

어떤 이유로 $USER설정되지 않은 경우 id명령을 사용 하여 실제 사용자의 ID를 얻을 수 있습니다 . 따라서 $USER변수를 처음 사용할 때 쉘 확장을 사용하여 기본값을 제공 할 수 있습니다. chown스크립트 의 줄을 다음과 같이 변경하십시오 .

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

이것이 USER실행될 때 비어 있거나 설정되어 있지 않으면 bash는 USER변수를/usr/bin/id -run


답변

스크립트를 호출하면 루트로 sudo설정 $USER됩니다.

$ sudo ./myscript.sh

나는 시도 chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename했지만 여전히 루트를 반환합니다.

who와 함께 사용하면을 사용 awk하여 스크립트를 호출 한 현재 사용자를 얻을 수 있음을 알았습니다 sudo.

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

답변

문제를 단순화하고 변수 sitename을 받고 있으므로 username 변수를 읽지 않는 이유는 무엇입니까?

이를 통해 스크립트 실행이 스크립트 실행 방식으로 제공되는 환경 변수에 의존하지 않는지 확인하십시오.


답변

내가 생각하는 작은 잘못이 있습니다. sudo는 명령을 실행하기위한 새 쉘을 열고 sudo 후에 사용자는 root입니다. 따라서 다음과 같은 것을 사용해야합니다.

MYUSER = $ USER

sudo chown $ MYUSER : $ MYUSER

MYUSER는 시스템에 덮어 쓰지 않았으며 작동합니다.