Ich bin gespannt, warum wir auch nicht zum Home Director eines Benutzers wechseln können
$ cd ~"$USER"
oder
$ cd ~${USER}
Ich bin gespannt, warum wir auch nicht zum Home Director eines Benutzers wechseln können
$ cd ~"$USER"
oder
$ cd ~${USER}
Antworten:
Das hängt sehr stark von der Shell und der Reihenfolge ab, in der die Erweiterungen in diesen Shells durchgeführt werden.
~$user
Erweitert das Home-Verzeichnis des Benutzers, dessen Name $user
in csh (woher diese ~user
Funktion stammt), AT & T ksh, zsh, fish gespeichert ist .
Beachten Sie jedoch diese Variationen:
$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx
$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x # same in fish
$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon # same in ksh/fish
$ u="/daemon" csh -c 'echo ~$u'
/home/stephane/daemon # same in zsh
$ u="/daemon" fish -c 'echo ~$u'
~/daemon # same in ksh
Es wird in das Home-Verzeichnis des Benutzers erweitert, der buchstäblich $user
in genannt wird bash
(vorausgesetzt, der Benutzer existiert, was natürlich sehr unwahrscheinlich ist).
Und weder in pdksh
, dash
, yash
, vermutlich weil sie nicht berücksichtigen $user
ein gültiger Benutzername sein.
Die Tilde-Erweiterung ist ein separater Schritt bei der Verarbeitung der Befehlszeile. Dies geschieht kurz vor der variablen Erweiterung.
Wenn auf die Tilde ein anderer als ein Schrägstrich folgt, wird sie in das Ausgangsverzeichnis des Benutzers erweitert, dessen Name der Tilde folgt, wie beispielsweise in ~otheruser
. Da $USER
es zu diesem Zeitpunkt nicht erweitert wird und es unwahrscheinlich ist, dass es einem gültigen Benutzernamen entspricht, bleibt die Tilde nicht erweitert.
$USER
ist wahrscheinlich der Benutzername des aktuellen Benutzers, daher könnte Ihr Ausdruck wahrscheinlich durch just ersetzt werden ~
.
Wie andere Antworten gezeigt haben, hängt das Verhalten davon ab, in welcher Reihenfolge die Shell ~
und welche $
Erweiterungen ausgeführt werden und ob sie sogar beide für dasselbe Wort ausführen .
Das Verhalten, nach dem Sie gesucht haben, kann bash
durch eine sehr kleine Änderung Ihres Befehls erreicht werden. Stellen Sie dem Befehl einfach das Präfix vor eval
.
eval "cd ~$USER"
wechselt in das Ausgangsverzeichnis des Benutzers, das durch den Benutzernamen in der Variablen angegeben wird USER
, vorausgesetzt, es $USER
enthält keine speziellen Zeichen für die Shell (wenn die Möglichkeit besteht, eval
dass dies der Fall ist , sollten Sie es nicht als Argument übergeben, da dies gefährlich wäre ) oder /
Zeichen und dass es einen Eintrag für diesen Benutzer in der Benutzerdatenbank des Systems gibt.
Eine alternative Möglichkeit, das Home-Verzeichnis eines variablen Benutzers nachzuschlagen , wenn Sie eine der Shells verwenden, in denen die Tilde-Erweiterung vor der variablen Erweiterung erfolgt, ist getent . Dieses Tool ist mindestens unter Linux, Solaris und FreeBSD verfügbar. Ich bin mir nicht sicher, wie universell es ist.
$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs
Wie bei der Tilde-Erweiterung erhalten Sie möglicherweise nicht das gleiche, su - $USER -c 'echo $HOME'
was gedruckt werden würde, wenn Sie die Berechtigungen dazu hätten.
perl -le 'print((getpwnam shift)[7])' -- "$USER"
als möglicherweise etwas tragbarer.
Da das OP auf einer Antwort besteht, ist es hier.
Das Verhalten dieser Befehle (und vieler anderer Dinge) hängt von der jeweiligen Shell ab, die Sie gerade verwenden. Wenn Sie nicht angeben, welche bestimmte Shell Sie verwenden, ist es wahrscheinlich nicht möglich, eine einfache Antwort zu geben.
Wenn Sie wie ich tcsh verwenden, funktionieren tatsächlich beide Ausdrücke in der Frage des OP (so wie sie geschrieben sind - ich übernehme keine Verantwortung für zukünftige Änderungen!) Perfekt. Ich weiß nicht, was andere Muscheln tun werden, da ich sie nicht benutze. Vielleicht weiß das OP nicht so viel darüber, was getan werden kann, wie er denkt :-)