Eine komische Frage, ich weiß. Hier ist das Skript:
echo $USER
Hier ist der Befehl, den ich zum Ausführen verwende:
sudo ./myscript.sh
Momentan wird „root“ gedruckt, aber ich möchte jon
, dass es meinen Benutzernamen ausgibt. Gibt es eine Möglichkeit, dies zu tun, indem man das Skript und nicht den Befehl ändert?
Antwort1
Verwenden Sie die SUDO_USER
Umgebungsvariable anstelle von USER
.
sudo
fügt den Namen des Benutzers, der es ausgeführt hat, in die SUDO_USER
Umgebungsvariable ein:
ek@Io:~$ sudo sh -c 'echo $USER'
[sudo] password for ek:
root
ek@Io:~$ sudo sh -c 'echo $SUDO_USER'
ek
Sie können in Ihrem Skript also einfach $USER
Folgendes ersetzen:$SUDO_USER
echo $SUDO_USER
Weitere Informationen
man sudo
, im Abschnitt „UMWELT“:SUDO_USER Set to the login name of the user who invoked sudo.
Die Manpage beschreibt auch einige andere verwandte Umgebungsvariablen, die von definiert werden
sudo
und nützlich sein können, wieSUDO_UID
undSUDO_GID
Beim Ausführen mit sudo wird $USER im Shell-Skript angezeigt?
Antwort2
Zusätzlich zu@Eliah Kagans Antwort oben, ich möchte darauf hinweisen, dass Sie auch problemlos eine Erweiterung haben können, die sowohl funktioniert, wenn sie in einem sudo
Kontext ausgeführt wird, als auch außerhalb:
echo "${SUDO_USER:-$USER}"
$SUDO_USER
Dies wird standardmäßig auf den Wert von erweitert , wenn die Variable jedoch nicht festgelegt oder leer ist, wird auf den Wert von zurückgegriffen $USER
.
$ bash -c 'echo "${SUDO_USER:-$USER}"'
bytecommander
$ sudo bash -c 'echo "${SUDO_USER:-$USER}"'
bytecommander
Weitere Informationen zur Standardparametererweiterung in Bash finden Sie beispielsweise unterhttps://wiki.bash-hackers.org/syntax/pe#use_a_default_value.