In Bash Eval wird es nicht benötigt, nur ist echo ~$usernamees in Ordnung, aber in Sh Eval wird es benötigt, wenn es eine Variable ist
Felipe Alcacibar
Dies gibt manchmal den falschen Wert, möglicherweise den Basisordner eines vorherigen Kontos mit demselben Benutzernamen?
Andrew
@ AndrewMacFie: Was meinst du mit "vorhergehend"?
Choroba
1
@choroba Fügen Sie einen Benutzer hinzu, löschen Sie den Benutzer und fügen Sie dann einen Benutzer mit demselben Benutzernamen hinzu. Wenn der Basisordner des Benutzers beim zweiten Mal anders ist, gibt dieser Befehl den ursprünglichen Basisordner anstelle des aktuellen Ordners an. Glenn Jackmans Antwort gibt die aktuelle.
Andrew
Beachten Sie auch, dass die Shell möglicherweise keine Sonderzeichen interpretiert , wenn Sie eval echo "~$USER"davon ausgehen, dass $USERdiese keine Sonderzeichen enthalten. Zum Beispiel wenn USER="foo\$bar", dann wenn wir evaldie Shell $barin Ihre Ausgabe einsetzen, was nicht das ist, was Sie wollen. Wenn Sie diesen Weg einschlagen, müssen Sie grundsätzlich sicherstellen, dass $USERes sich um eine vernünftige Eingabe handelt. Meistens wird es wahrscheinlich sein, aber Sie sollten dies berücksichtigen.
Zorawar
65
Das könnte für Sie funktionieren:
homedir=$( getent passwd "$USER"| cut -d:-f6 )
Dies funktioniert auch für Benutzer, die nicht Sie sind. Zum Beispiel,
Dies ist legitim, getenvanstatt davon auszugehen, dass der Standort von passwdnoch einen Schritt weiter ist, als davon auszugehen, dass der Standort von zu Hause ist/home/
Evan Carroll
13
Es scheint, dass Sie dieser Benutzer sind - warum nicht
Dies funktioniert nicht, wenn Sie sich in einer sudo'ed-Umgebung befinden und sudo die Flags -H oder -i nicht übergeben haben. $ HOME ist weiterhin das Ausgangsverzeichnis des vorherigen (sudo'ing) Benutzers.
Asfand Qazi,
1
Ich weiß nicht, ob es hilft, aber das Platzieren der Tilde außerhalb des Ausdrucks funktioniert in ZSH, aber nicht in Bash:
Das wird nicht funktionieren. Die Idee hier ist, dies in Shell-Skript zu tun, und vermutlich ohne die Anmeldeinformationen des betreffenden Benutzers erforderlich ...
SamB
-1 aus dem gleichen Grund, den SamB erwähnt hat. Ich habe Ihre Antwort bearbeitet, weil ich möchte, dass Sie erfahren, wie Sie die Markdown-Formatierung verwenden und präziser vorgehen. Sie haben auch die viel einfachere Methode verpasst, die einfach ist echo $HOME.
echo ~$username
es in Ordnung, aber in Sh Eval wird es benötigt, wenn es eine Variable isteval echo "~$USER"
davon ausgehen, dass$USER
diese keine Sonderzeichen enthalten. Zum Beispiel wennUSER="foo\$bar"
, dann wenn wireval
die Shell$bar
in Ihre Ausgabe einsetzen, was nicht das ist, was Sie wollen. Wenn Sie diesen Weg einschlagen, müssen Sie grundsätzlich sicherstellen, dass$USER
es sich um eine vernünftige Eingabe handelt. Meistens wird es wahrscheinlich sein, aber Sie sollten dies berücksichtigen.Das könnte für Sie funktionieren:
Dies funktioniert auch für Benutzer, die nicht Sie sind. Zum Beispiel,
quelle
getenv
anstatt davon auszugehen, dass der Standort vonpasswd
noch einen Schritt weiter ist, als davon auszugehen, dass der Standort von zu Hause ist/home/
Es scheint, dass Sie dieser Benutzer sind - warum nicht
?
quelle
Ich weiß nicht, ob es hilft, aber das Platzieren der Tilde außerhalb des Ausdrucks funktioniert in ZSH, aber nicht in Bash:
quelle
Sobald Sie sich angemeldet, führen
cd
zu Ihrem Home - Verzeichnis zu gehen, dann laufenpwd
das Arbeitsverzeichnis zu drucken.quelle
echo $HOME
.