cd ~ <Benutzer> ist möglich, aber warum können wir nicht cd ~ "$ USER" oder cd ~ $ {USER}

8

Ich bin gespannt, warum wir auch nicht zum Home Director eines Benutzers wechseln können

$ cd ~"$USER"

oder

$ cd ~${USER}
Neo_Returns
quelle
4
Weil es so viel einfacher ist, "cd" einzugeben?
Jamesqf
7
@jamesqf, wir alle wissen, was getan werden kann. Die Frage hier ist, was nicht getan werden kann und warum.
Neo_Returns

Antworten:

20

Das hängt sehr stark von der Shell und der Reihenfolge ab, in der die Erweiterungen in diesen Shells durchgeführt werden.

~$userErweitert das Home-Verzeichnis des Benutzers, dessen Name $userin csh (woher diese ~userFunktion 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 $userin 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 $userein gültiger Benutzername sein.

Stéphane Chazelas
quelle
Können Sie mir bitte vorschlagen, wo ich mehr über die Erweiterung in verschiedenen Schalen erfahren kann?
Neo_Returns
6
@Neo_Returns, ihre jeweiligen Handbücher, und wenn das nicht klar dokumentiert ist, mit Versuch und Irrtum und dem Quellcode für diejenigen, wo es verfügbar ist ...
Stéphane Chazelas
10

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 $USERes zu diesem Zeitpunkt nicht erweitert wird und es unwahrscheinlich ist, dass es einem gültigen Benutzernamen entspricht, bleibt die Tilde nicht erweitert.

$USERist wahrscheinlich der Benutzername des aktuellen Benutzers, daher könnte Ihr Ausdruck wahrscheinlich durch just ersetzt werden ~.

Kusalananda
quelle
6

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 bashdurch 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 $USERenthält keine speziellen Zeichen für die Shell (wenn die Möglichkeit besteht, evaldass 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.

Kasperd
quelle
3

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.

zwol
quelle
1
Siehe auch perl -le 'print((getpwnam shift)[7])' -- "$USER"als möglicherweise etwas tragbarer.
Stéphane Chazelas
-2

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 :-)

jamesqf
quelle