Ich ändere meine .bashrc häufig und beziehe sie dann. Wenn ich jedoch Dinge export PATH="~/bin:~/perl5/bin:$PATH"
in meiner Datei habe, PATH
wächst die Umgebungsvariable jedes Mal , wenn ich die
Datei beschaffe.
Wenn zum Beispiel .bashrc zum ersten Mal bezogen wird, PATH
besteht die Variable aus ~/bin:~/perl5/bin:/usr/bin:/bin
.
Das zweite Mal besteht es aus ~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Das dritte Mal besteht es aus ~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Gibt es eine einfache Möglichkeit, nur etwas hinzuzufügen, das noch nicht im PATH enthalten ist?
/etc/profile
Debian Lenny, also nehme ich es in meine auf.bashrc
.pathmunge /some/path
findet/some/path
am Anfang$PATH
undpathmunge /some/path after
findet/some/path
am Ende$PATH
if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then
.pathmunge /foo before
schafft das nicht. Ein besserer Weg wäre, am Anfang / foo hinzuzufügen und anschließend Duplikate zu entfernen.Ich hatte dieses Problem, also habe ich eine Kombination von Techniken verwendet, die in der StackOverflow- Frage aufgeführt sind. Folgendes habe ich verwendet, um die tatsächlich festgelegte PATH-Variable zu deduplizieren, da ich das Basisskript nicht ändern wollte.
Sie könnten dies immer etwas weiter optimieren, aber ich hatte zusätzlichen Code in meinem Original, um anzuzeigen, was passiert ist, um sicherzustellen, dass die Variablen korrekt eingestellt wurden. Die andere Sache zu beachten ist, dass ich Folgendes durchführe
Dies soll sicherstellen, dass ich Verzeichnisse mit Leerzeichen in verarbeiten kann (Samba-Ausgangsverzeichnisse mit Active Directory-Benutzernamen können Leerzeichen enthalten!).
quelle
/bin
wenn es andere Einträge gibt, z. B./usr/bin
weil der reguläre Ausdruck übereinstimmt, obwohl die beiden Einträge nicht identisch sind!Legen Sie Ihren Pfad explizit fest.
quelle
PATH
nicht immer der gleiche ist.Nur eine Zeichenfolge:
quelle
$PATH
. Ich möchte bestimmte Verzeichnisse am Anfang von$PATH
(like/home/username
) einfügen, damit meine persönlichen Kopien von ausführbaren Dateien anstelle der integrierten Standardeinstellungen ausgeführt werden.Ich kann mir zwei verschiedene Möglichkeiten vorstellen, wie Sie dies lösen können. Die erste besteht darin, Ihre .bashrc-Datei mit einer Zeile zu starten, in der Ihr Basis-PATH explizit festgelegt wird. Auf diese Weise wird die Basis jedes Mal, wenn Sie sie als Quelle verwenden, auf die Basis zurückgesetzt, bevor zusätzliche Verzeichnisse hinzugefügt werden.
Fügen Sie zum Beispiel hinzu:
Alternativ können Sie nach einem Element suchen, bevor Sie es dem Pfad hinzufügen. Dazu verwenden Sie Folgendes:
Letzteres wiederholt sich ein wenig, wenn Sie jedoch viele Einträge hinzufügen, sodass ich mich eher an Ersteres halte. Wenn Sie dies verwenden möchten und viele Einträge hinzufügen möchten, ist es ratsam, eine Bash-Funktion zu schreiben, um damit umzugehen.
Hinweis: Die zweite Option funktioniert möglicherweise nur wie in modernen Bash-Versionen beschrieben. Die Unterstützung für reguläre Ausdrücke ist keine Bourne-Shell-Funktion (/ bin / sh) und möglicherweise nicht in anderen Shells vorhanden. Außerdem ist die Verwendung von Anführungszeichen möglicherweise nicht erforderlich oder kann bei einigen neuesten Versionen von Bash sogar zu Problemen führen.
quelle
PATH
nicht immer der gleiche ist.if
. Außerdem ist es (für mich) überraschend einfach, daraus eine Funktion zu machen, die durch Leerzeichen getrennte Argumenteadd_to_PATH ~/perl5/bin ~/.bin
durchläuft. Sie können also einfach sagen: unix.stackexchange.com/a/4973/28760 (Ich denke, die dort verwendetecase
Anweisung ist portabler , aber deinif
ist mir klarer). BEARBEITEN Sie seltsamen Zufall, dass diese Frage auch perl5 hinzufügt!Hier ist meine Lösung:
PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")
Ein schöner, einfacher Einzeiler, der keine Spur hinterlässt:
quelle