Option 1: Ein besser platzierter Symlink

Option 1: Ein besser platzierter Symlink

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/localwo alle meine Homebrew-Pakete und Konfigurationsdateien gespeichert sind. Es ist eine wirklich einfache Abkürzung. Ich mag es auch, meinen symbolischen Link-Pfad verwenden cdund 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/homeSymlink 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 $HOMEVariable nicht ändert, besser dran wären. Ihre $HOMEVariable 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/localvon Ihrem Home-Verzeichnis zu , entfernen Sie den /usr/local/homeaktuellen Link und entfernen Sie die Zeile, die Ihre $HOMEVariable ä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/homekönnen Sie etwa Folgendes tun und ulocdurch 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, cdin Zsh verwenden, indem Sie ihr ein ~Zeichen voranstellen, ähnlich wie Sie ~userals 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/localwie in Ihrem Fall.

Mit dieser cdable_varsOption 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.cdauto_cdcdegal, wo du bist. Gegensätzlich zuOption 1, da Sie sich nicht auf einen Symlink verlassen, cding zu diesem benannten Verzeichniswird Sie tatsächlich in dieses Verzeichnis setzen, sodass und nicht pwdzurü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 $PATHzu werden Verzeichnisse in jedoch $CDPATHals „Stamm“ für relative Pfade verwendet, die angegeben werden, cdwenn 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]

shareDa in kein Verzeichnis mit dem Namen vorkam ~/foo, suchte Zsh $CDPATHnach Stellen, an denen sharesich ein untergeordnetes Verzeichnis befinden könnte. Da /usr/localin lag $CDPATHund shareein untergeordnetes Verzeichnis von ist /usr/local, können Sie cd sharevon innerhalb von aus ~/fooauf zugreifen. Sie können auch tiefer gehen. Wenn beispielsweise stuffein 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 wie cdpathund dergleichen
  • zshoptions(1)— Detaillierte Angaben zu allen Optionen, die das Zsh-Verhalten über die setoptintegrierten Funktionen steuern. Enthält ausführlichere Erklärungen zu cdable_varsund auto_cdals diese Antwort bietet.

verwandte Informationen