Ich verwende macOS und meine Shell ist zsh. Standardmäßig ist das Home-Verzeichnis meines Systems /Users/njohn
. Ich habe einen symbolischen Link zu diesem Pfad erstellt, /usr/local/home
. Ich habe HOME="/usr/local/home"
meinen eingefügt .zshrc
. Ich habe das gemacht, damit ich zuerst schnell cd ..
von meinem Home-Verzeichnis dorthin gelangen kann, /usr/local
wo alle meine Homebrew-Pakete und Konfigurationsdateien gespeichert sind. Es ist eine wirklich einfache Abkürzung. Ich mag es auch, meinen symbolischen Link-Pfad verwenden cd
und dorthin gelangen zu können, anstatt den normalen, der im Dateisystem weit weg von Dingen ist, denen ich näher sein möchte.
Könnte dadurch möglicherweise etwas kaputt gehen? Gibt es einen sichereren oder besseren Weg, dasselbe zu erreichen?
Antwort1
Haftungsausschluss: Ich verwende kein MacOS und habe auch nie eines verwendet. Daher bin ich mir nicht ganz sicher, ob es zwischen Mac und *nix Unregelmäßigkeiten oder geringfügige Unterschiede gibt (sofern es welche gibt).
Um Ihre Frage zu beantworten: Das einzige Szenario, in dem ich mir vorstellen kann, dass es bei diesem Setup zu einem „Zusammenbruch“ kommt, ist, wenn ein bestimmtes Programm versucht, etwas mit Ihrem Home-Verzeichnis zu tun und es entweder standardmäßig keine Symlinks befolgt (oder aus irgendeinem Grund überhaupt nicht). Wenn irgendein hypothetisches Programm versucht, eine Datei in Ihrem Home-Verzeichnis zu lesen/schreiben und es Ihren /usr/local/home
Symlink nicht auflöst, wird es wahrscheinlich zu einem Zusammenbruch kommen. Die Wahrscheinlichkeit eines solchen Szenarios ist mir jedoch schleierhaft.
Dennoch denke ich, dass Sie mit einem Ansatz, der Ihre $HOME
Variable nicht ändert, besser dran wären. Ihre $HOME
Variable für die Dauer jeder interaktiven Shell, die Sie starten, in etwas anderes zu ändern, als das, was das System als Ihr Home-Verzeichnis versteht, ist hässlich, hackig und führt zwangsläufig zu subtilen Problemen. Ich werde Ihnen drei bessere Alternativen anbieten.
Option 1: Ein besser platzierter Symlink
Wenn Sie bei einem Symlink bleiben möchten, erstellen Sie einfach einen Symlink /usr/local
von Ihrem Home-Verzeichnis zu , entfernen Sie den /usr/local/home
aktuellen Link und entfernen Sie die Zeile, die Ihre $HOME
Variable ändert, aus Ihrem .zshrc
. Beispiel:
% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local
Ähnlich wie bei Ihrem aktuellen Zugriff können Sie von Ihrem Home-Verzeichnis aus schnell zu /usr/local gelangen, nur dass Sie auf diese Weise keine Änderungen vornehmen müssen $HOME
.
Option 2: Benannte Verzeichnisse
Da Sie Zsh verwenden, empfehle ich die Verwendung einesbenanntes Verzeichnis. Statt HOME=/usr/local/home
können Sie etwa Folgendes tun und uloc
durch einen Kurznamen Ihrer Wahl ersetzen:
uloc=/usr/local
Dann können Sie schnell in dieses Verzeichnis wechselnvon überallauf folgende Weise:
# With no special options set
% cd ~uloc
# Slightly shorter
% setopt cdable_vars
% cd uloc
# Even shorter
% setopt cdable_vars auto_cd
% uloc
Wie Sie sehen, können Sie eine Variable, die sich zu einem Pfad erweitert, cd
in Zsh verwenden, indem Sie ihr ein ~
Zeichen voranstellen, ähnlich wie Sie ~user
als Abkürzung für verwenden können /home/user
. Sie können so viele benannte Verzeichnisse haben, wie Sie möchten, sodass Sie schnell auf Folgendes zugreifen können:beliebigVerzeichnis, das Sie häufig verwenden, nicht nur /usr/local
wie in Ihrem Fall.
Mit dieser cdable_vars
Option können Sie die Option für benannte Verzeichnisse weglassen , ~
wenn Sie verwenden. Wenn Sie einen „Befehl“ eingeben, der tatsächlich ein Verzeichnis ist (benannt oder wörtlich), wird Zsh automatisch in dieses Verzeichnis wechseln. Die Kombination dieser beiden ermöglicht Ihnen einen schnellen Zugriff auf ein gewünschtes Verzeichnis.cd
auto_cd
cd
egal, wo du bist. Gegensätzlich zuOption 1, da Sie sich nicht auf einen Symlink verlassen, cd
ing zu diesem benannten Verzeichniswird Sie tatsächlich in dieses Verzeichnis setzen, sodass und nicht pwd
zurückgeben würde ./usr/local
/Users/njohn/uloc
Option 3: Verwenden von CDPATH
Dieser Ansatz kann allein oder in Kombination mitOption 2.
Sie können auch verwenden $CDPATH
, eine spezielle Variable wie $PATH
, die eine Liste von Verzeichnissen enthält. Im Gegensatz $PATH
zu werden Verzeichnisse in jedoch $CDPATH
als „Stamm“ für relative Pfade verwendet, die angegeben werden, cd
wenn der angegebene Pfad nicht im aktuellen Verzeichnis gefunden wird. Betrachten Sie zur Veranschaulichung Folgendes:
# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]
share
Da in kein Verzeichnis mit dem Namen vorkam ~/foo
, suchte Zsh $CDPATH
nach Stellen, an denen share
sich ein untergeordnetes Verzeichnis befinden könnte. Da /usr/local
in lag $CDPATH
und share
ein untergeordnetes Verzeichnis von ist /usr/local
, können Sie cd share
von innerhalb von aus ~/foo
auf zugreifen. Sie können auch tiefer gehen. Wenn beispielsweise stuff
ein Unterverzeichnis von war /usr/local/share
, können Sie dorthin gelangen, indem Sie ausführen cd share/stuff
.
Notiz:Im Gegensatz zu Bash sucht Zsh immer im aktuellen VerzeichnisVorVersuchen Sie Verzeichnisse in $CDPATH
,es sei denna .
ist in enthalten $CDPATH
. In diesem Fall hält sich Zsh strikt an die Verzeichnisreihenfolge in $CDPATH
.
Dies bietet Ihnen noch mehr Komfort, da Sie, wie Sie sagten, häufig Zugriff auf Ihre Homebrew-Pakete und -Konfigurationen benötigen und von überall aus in eines dieser Unterverzeichnisse gelangen können cd
, ohne dass Sie hierfür ein Präfix benötigen!
Wie bereits erwähnt, können Sie dies mit benannten Verzeichnissen kombinieren. Hier ein Beispiel aus meinen eigenen Dotfiles:
ZSH=~/.zsh
cdpath=(~/.zsh)
# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]
Weitere Informationen
Ich empfehle, sich mit Zsh und seinen zahlreichen Funktionen* vertraut zu machen. Hier sind einige Manpages und andere Themen, die Sie sich ansehen können:
symlink(7)
– Beschreibt symbolische Links im Detail und wie mit ihnen interagiert wird.zshexpn(1)
, „Statische benannte Verzeichnisse“ – Erklärt benannte Verzeichnisse, und der Rest der Manpage beschreibt alle Formen der Erweiterung in Zsh.zshparam(1)
, „VON DER SHELL VERWENDETE PARAMETER“ — Enthält Beschreibungen für spezielle Variablen wiecdpath
und dergleichenzshoptions(1)
— Detaillierte Angaben zu allen Optionen, die das Zsh-Verhalten über diesetopt
integrierten Funktionen steuern. Enthält ausführlichere Erklärungen zucdable_vars
undauto_cd
als diese Antwort bietet.