Bearbeiten: Dies ist ein Duplikat von /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . Ich habe nicht den Ruf, diese Frage als Duplikat zu schließen.
Ich beziehe mich nicht auf ~
das Home-Verzeichnis, sondern auf Folgendes:
$ ls ~foo/bar
/some/mount/point/foo/bar
Wenn ich es jedoch mit einem anderen Einhängepunkt versuche, z.
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
Wie heißt das ~
in diesem Zusammenhang? Wie funktioniert es?
Bearbeiten: Weitere Informationen basierend auf einigen der folgenden Kommentare:
- Ich kann bestätigen, dass dies
foo
kein Benutzername auf meinem System ist. - Beim Versuch der automatischen Vervollständigung werden
ls -lah ~
nicht alle Optionen angezeigt. dh ich kanncd ~qux
, wennqux
nicht in der Autovervollständigung angezeigt wird. Wiederqux
ist kein Benutzer in meinem System. - Wenn es darauf ankommt,
/some/mount/point
handelt es sich um eine Netzwerkfreigabe. - Alle Details deuten auf ein benanntes Pfad-Muckery hin, eine Z-Shell-Funktion der Pfadnamenerweiterung, aber dies funktioniert auch in Bash, das anscheinend Dinge wie die benannten Pfade der Z-Shell nicht unterstützt.
~foo
ist das Home-Verzeichnis des Benutzersfoo
. Wenn der Benutzer nicht angegeben ist, ist der aktuelle Benutzer der Standard./some/mount/point
definitiv nicht mein Home-Verzeichnis.cd ~
bringt mich zu -/Users/$username/
welche Spiele$HOME
zsh
scheint auch die Tilde zu verwenden, um benannte Verzeichnisse anzugeben.bash -c "ls ~foo/bar"
) - ohne benannte Verzeichnisse. Außerdemenv
sehe ich selbst innerhalb von zsh, wenn ich das inspiziere , keine benannten Verzeichnisse eingerichtet. Ich bin unter Mac OS und ich denke, dies ist eine spezifische Funktion für OS X.~foo
. Nehmen Sie die eigentliche Zeichenfolge (nicht das Beispielfoo
) und tun Sie diesgrep "actual username" /etc/passwd
.~text
sollte nur für mögliche Login-Benutzernamen gemäß dem Bash-Handbuch funktionieren (bedeutet nicht unbedingt, dass es tatsächlich möglich ist, sich anzumelden; bei Systembenutzern wie~lp
zum Beispiel). In all meinen Tests~string
entspricht dasstring
dem Benutzernamen.Antworten:
Was ist ~ foo
Zitat aus dem Bash-Handbuch (mit zusätzlicher Betonung):
~foo
Erweitert dasfoo
Ausgangsverzeichnis des Benutzers genau wie in angegeben/etc/passwd
. Beachten Sie, dass dies Systembenutzernamen umfassen kann. Dies bedeutet nicht unbedingt, dass menschliche Benutzer sich tatsächlich lokal anmelden können (sie können sich beispielsweise über SSH-Schlüssel anmelden).Tatsächlich wird, wie in den Kommentaren angegeben ,
bash
diegetpwnam
Funktion verwendet. Diese Funktion selbst ist im POSIX- Standard festgelegt und sollte daher auf den meisten Unix-ähnlichen Systemen, einschließlich macOS X, vorhanden sein . Diese Funktion ist nicht nur auf/etc/passwd
andere Datenbanken wie LDAP und NIS beschränkt und durchsucht diese. Besonderer Auszug ausbash
Quellcode ,tilde.c
Datei, ab Zeile 394:Praktisches Beispiel
Unten sehen Sie Tests mit Systembenutzernamen auf meinem System. Achten Sie auf den entsprechenden
passwd
Eintrag und das Ergebnis vonls ~username
Auch wenn zum Beispiel das
_apt
Konto gesperrt ist, wie durch die Ausgabe vorgeschlagen, wirdpasswd -S apt
es immer noch als möglicher Anmeldename angezeigt:Bitte beachten Sie: Dies ist keine macOS-spezifische Funktion, sondern eine Shell-spezifische Funktion.
quelle
/etc/shadow
zusammen mit den anderen geschützten Authentifizierungsinformationen wie dem Kennwort gespeichert . Bei der Referenz inpasswd
geht es nur darum, das Kennwort ungültig zu machen: Dies würde die Authentifizierung auf andere Weise nicht verhindern.testuser
und Ändern des Kennwortablaufdatums getestet . Der Benutzername wird weiterhin in Tab-Vervollständigung angezeigt. Ich habe dieses Bit aus der Antwort entferntbash
Manpage zitiert (und anscheinend die alte). Das OP verwendet tatsächlichzsh
(hätte klarer sein können), obwohl in den Kommentaren erwähnt wird, dassbash
es das gleiche Verhalten hat.getent passwd foo
stattdessengrep foo /etc/password
dieselben Suchmechanismen wie die Shell verwenden, um möglicherweise netzwerkbasierte Verzeichnisdienste einzuschließen, die von @Abigail erwähnt werden.Zusammenfassend lässt sich sagen, warum Sie etwas sehen
~foo/bar
, weil Sie einen Benutzerfoo
auf dem System mit einem Ordnerbar
in seinem Ausgangsverzeichnis haben.Sehen Sie sich diese Lösung in einer anderen Community an , in der erklärt wird, warum (Tilde)
~
mehr als nur ein "Home-Verzeichnis" ist.Wenn
bin
auf Ihrem System ein Benutzer benannt ist, können Sie den Inhalt des Home-Verzeichnisses von bin mit dem folgenden Befehl auflisten:ls ~bin
Sie können auch versuchen, die Tab-Vervollständigung zu verwenden, nachdem Sie an einer Eingabeaufforderung Folgendes eingegeben haben (kein Wagenrücklauf, verwenden Sie einfach die Tabulatortaste):
ls -lah ~
tabum die Liste der Home-Verzeichnisse der Benutzer anzuzeigen,
~
die erweitert werden, wenn Sie fortfahren. Beispielausgabe (abgeschnitten) der Tab-Vervollständigung vonls -lah ~
tabquelle
/etc/passwd
. Es hilft sofort zu klären, was los ist, wenn der Benutzer natürlich die Benutzernamen kennt, die er auf dem System hat.~foo
der automatischen Vervollständigung kann ich bestätigen, dassfoo
es sich nicht um einen Benutzer auf meinem System handelt (und in der Tat nicht vorhanden ist/etc/passwd
). Außerdem werden alle Ordner / Dateien/some/mount/point
in der Autovervollständigung angezeigt, was sehr interessant ist.