kB schrieb:
Ich finde in der Programmumgebung mehrere Variablen für den Benutzernamen:
$ printenv | grep $USER
USERNAME=tester
USER=tester
PWD=/home/tester
HOME=/home/tester
LOGNAME=tester
PWD ändert sich sobald Du das Verzeichnis wechselst - ist also nur zufällig das gleiche wie HOME. HOME bezeichnen nicht den Nutzernamen, sondern den Pfad seines Homeverzeichnisses. Der letzte Teil ist normalerweise gleich dem Nutzernamen, aber das ist nicht garantiert! Diese beiden Variablen fallen also auf jeden Fall aus.
Ich vermute mal, dass die Variablen USERNAME
, USER
und LOGNAME
nicht immer so wie hier gleich lauten.
Genau. LOGNAME wird zwar von login
auf den selben Wert wie USER
gesetzt, aber sudo
auch anders (siehe Manpage). Weitere Infos z.B. hier.
Wann verwende ich also welche Variable?
Hintergrund: Ich benötige für ein Skript den Benutzernamen zur Anmeldung an einer Netzwerk-Ressource und bin mir unsicher, welche der drei in Frage kommenden Variablen ich dafür am sinnvollsten verwende.
Im Allgemeinen sollte man USER verwenden. Das wird zwar nicht bei POSIX definiert aber immerhin unter 8.1 Environment Variable Definition als eine der Variablen benannt, die man nicht setzen sollte, weil sie von häufigen Kommandointerpretern genutzt werden.
Wenn Du ein bisschen paranoid bist, kannst Du dies tun, um ganz sicher zu sein:
(Oder Du speicherst den Wert in einer anderen Variable.) Damit ist garantiert, dass USER den korrekten Wert beinhaltet, denn man kann USER willkürlich überschreiben im Gegensatz zu PWD z.B., das die Shell immer auf das aktuelle Verzeichnis setzt:
| $ USER=xyz bash -c 'echo $USER'
xyz
$ USER=xyz sh -c 'echo $USER'
xyz
$ pwd; PWD=xyz sh -c 'echo $PWD'
/tmp
/tmp
|