私が実行している小さな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
の問題ですか?
[〜#〜] edit [〜#〜]これが完全なスクリプトです。 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"
何らかの理由で$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を取得しているので、なぜユーザー名変数を読み取らないのですか?
これにより、スクリプトの実行が、スクリプトの実行方法で利用できるようにされた環境変数に依存しないことを確認できます。
ほんの小さな欠点があると思います。 Sudoはコマンドを実行するための新しいシェルを開き、Sudoの後、ユーザーはrootになります。だから多分あなたはこのようなものを使うべきです:
MYUSER = $ USER
Sudo chown $ MYUSER:$ MYUSER
私がMYUSERは上書きされたsystemspezificではなく、うまくいくと思うので。