Was ist das richtige Format der PATH-Variable?

Was ist das richtige Format der PATH-Variable?

Ich habe ein macOS und dies ist die Ausgabe, die ich bekomme, wenn ichecho $PATH

usr/local/opt/avr-gcc@8/bin:/Users/hari/google-cloud-sdk/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.pub-cache/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/Library/Android/sdk/platform-tools/.:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.pub-cache/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.fzf/bin

Ist das richtig? Ist das lang und wenn lang, wie kann ich es kürzen? Bitte helfen Sie

Antwort1

PATHist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die Ihre Shell nach ausführbaren Dateien durchsucht. PATHDie Manipulation ist schwierig, aber es gibt Tools. Ich verwende Stephen Collyers bash_path_funcs, das bereits im Jahr 2000 im Linux Journal beschrieben wurde:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://www.linuxjournal.com/article/3935

Die addpathFunktion fügt einem Pfad nur dann einen Eintrag hinzu, wenn dieser noch nicht vorhanden ist. delpath -nLöscht alle nicht vorhandenen Verzeichnisse aus einem Pfad. uniqpathEliminiert Duplikate.

Sie können die pathfunc.tgzDatei von herunterladenhttps://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

Antwort2

$ printf '%s\n' $path | sort | uniq -c
  16 /Library/Apple/usr/bin
  16 /Library/Frameworks/EdgeDB.framework/bin
  16 /Library/Frameworks/Python.framework/Versions/3.9/bin
  16 /Users/hari/.cargo/bin
  16 /Users/hari/.edgedb/bin
  16 /Users/hari/.fig/bin
   1 /Users/hari/.fzf/bin
   4 /Users/hari/.npm/bin
   2 /Users/hari/.pub-cache/bin
   1 /Users/hari/Library/Android/sdk/platform-tools/.
   8 /Users/hari/flutter/bin
  16 /Users/hari/go
  16 /Users/hari/go/bin
   1 /Users/hari/google-cloud-sdk/bin
  16 /bin
  16 /opt/X11/bin
  16 /sbin
  16 /usr/bin
  16 /usr/local/bin
  16 /usr/local/go
  16 /usr/local/go/bin
  16 /usr/sbin
   1 usr/local/opt/avr-gcc@8/bin

Wie Sie sehen, PATHenthält Ihre Variable mehrere Kopien von Pfaden, wodurch sie übermäßig lang wird.

Dies könnte auf eine Weise gehandhabt werden, die für die zshShell spezifisch (und möglicherweise einzigartig) ist. In dieser Shell $PATHist die Skalarvariable an die Arrayvariable „gebunden“ $path(verwendet im kurzen Shell-Codestück oben), was bedeutet, dass eine Änderung der einen die andere automatisch aktualisiert. Darüber hinaus zshkann in der Shell eine Arrayvariable so deklariert werden, dass sie „nur eindeutige Elemente enthält“. Wenn wir dies auf die PATHund pathVariablen anwenden, erhalten wir eine Möglichkeit, sicherzustellen, dass die PATHnicht so wächst wie bei Ihnen.

typeset -g -U PATH path

Die -gOption typesetbewirkt, dass die angegebenen Variablen als „global“ (anstatt als „lokal“ für den aktuellen Bereich) deklariert werden und -Udass die pathVariable nur das erste Vorkommen jeder Variable behält.

Wenn Sie diesen typesetBefehl zum ersten von oder hinzufügen ~/.zshenv, der in Ihrem Home-Verzeichnis vorhanden ist, stellen Sie sicher, dass er für Ihre interaktiven Shell-Sitzungen im Terminal aktiv ist.~/.zprofile~/.zshrc

$ typeset -g -U PATH path
$ printf '%s\n' $path  | sort | uniq -c
   1 /Library/Apple/usr/bin
   1 /Library/Frameworks/EdgeDB.framework/bin
   1 /Library/Frameworks/Python.framework/Versions/3.9/bin
   1 /Users/hari/.cargo/bin
   1 /Users/hari/.edgedb/bin
   1 /Users/hari/.fig/bin
   1 /Users/hari/.fzf/bin
   1 /Users/hari/.npm/bin
   1 /Users/hari/.pub-cache/bin
   1 /Users/hari/Library/Android/sdk/platform-tools/.
   1 /Users/hari/flutter/bin
   1 /Users/hari/go
   1 /Users/hari/go/bin
   1 /Users/hari/google-cloud-sdk/bin
   1 /bin
   1 /opt/X11/bin
   1 /sbin
   1 /usr/bin
   1 /usr/local/bin
   1 /usr/local/go
   1 /usr/local/go/bin
   1 /usr/sbin
   1 usr/local/opt/avr-gcc@8/bin

Um einen Pfad am Ende von hinzuzufügen PATH,

path+=( '/new/path' )

oder

path=( $path '/new/path' )

Um einen Pfad zum Anfang von hinzuzufügen PATH,

path=( '/new/path' $path )

Wenn die pathVariable mit „eindeutig“ gemacht wurde typeset -U, wird nur das erste Vorkommen des neuen Pfades in der Variable beibehalten.

verwandte Informationen