Ich versuche, wxWidgets mit MingW zu kompilieren, und ich habe Cygwin auf meinem Weg, was zu Konflikten zu führen scheint. Ich möchte also /d/Programme/cygwin/bin
aus der PATH-Variablen entfernen und frage mich, ob es eine elegante Möglichkeit gibt, dies zu tun.
Der naive Ansatz wäre, es in eine Datei umzuwandeln, sie manuell zu entfernen und als Quelle zu verwenden, aber ich wette, es gibt einen besseren Ansatz dafür.
bash
shell
environment-variables
path
Devolus
quelle
quelle
Antworten:
Es gibt keine Standardwerkzeuge, um den Wert von $ PATH zu "bearbeiten" (dh "Ordner nur hinzufügen, wenn er noch nicht existiert" oder "Diesen Ordner entfernen"). Sie führen gerade aus:
Dies gilt für die aktuelle Sitzung, wenn Sie sie dauerhaft ändern möchten und sie zu einer beliebigen .bashrc-, bash.bashrc- oder / etc / -Profildatei hinzufügen möchten. Wenn Sie jedoch BASH verwenden, können Sie auch Folgendes tun, wenn Sie beispielsweise das Verzeichnis
/home/wrong/dir/
aus Ihrer PATH-Variablen entfernen möchten , vorausgesetzt, es befindet sich am Ende:Also in deinem Fall darfst du verwenden
quelle
/
durch Folgendes zu ersetzen|
: umPATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
zu verhindern, dass alles entweicht.In der Bash:
Wenn Sie keine Zwischenvariable verwenden, müssen Sie
/
die zu entfernenden Zeichen im Verzeichnis schützen , damit sie nicht als Ende des Suchtextes behandelt werden.Die erste und die dritte Zeile sind dafür vorgesehen, dass jede Komponente des Suchpfads von
:
einer speziellen Umhüllung der ersten und der letzten Komponente umgeben wird. Die zweite Zeile entfernt die angegebene Komponente.quelle
Nachdem ich andere hier vorgestellte Optionen in Betracht gezogen und nicht vollständig verstanden hatte, wie einige von ihnen funktionierten, entwickelte ich meine eigene
path_remove
Funktion, die ich zu meiner hinzufügte.bashrc
:Dies endete ziemlich nahe an Gilles 'Lösung, wurde jedoch als Bash-Funktion zusammengefasst, die einfach in der Befehlszeile verwendet werden konnte.
Es hat den Vorteil, dass es als Bash-Funktion wie ein Programm funktioniert, ohne dass es ein Programm auf dem Pfad sein muss, und dass keine externen Programme ausgeführt werden müssen, sondern lediglich die Manipulation von Bash-Strings.
Es erscheint ziemlich robust, insbesondere verwandelt es sich nicht
somepath:mypath/mysubpath
insomepath/mysubpath
: Wenn Sie ausführenpath_remove mypath
, was ein Problem war, das ich mit meiner vorherigenpath_remove
Funktion hatte.Eine hervorragende Erklärung für die Funktionsweise der Bash-Manipulation finden Sie im Advanced Bash-Scripting Guide .
quelle
Aus den Antworten von @gilles und @ bruno-a (und ein paar anderen Sed-Tricks) habe ich diesen Einzeiler entwickelt, der (jeden) REMOVE_PART aus PATH entfernt, unabhängig davon, ob er zu Beginn auftritt. Mitte oder Ende von PATH
Es ist ein bisschen unhandlich, aber es ist schön, es mit einem Schlag schaffen zu können. Mit
;
dem werden die beiden getrennten sed-Befehle zusammengefügt:s@:$REMOVE_PART:@:@g
(die:$REMOVE_PART:
mit einem einzigen ersetzt:
)s@^:\(.*\):\$@\1@
(Dies entfernt die führenden und nachfolgenden Doppelpunkte, die wir mit dem Befehl echo hinzugefügt haben.)In ähnlicher Weise habe ich es gerade geschafft, diesen Einzeiler für das Hinzufügen eines ADD_PART zum PATH zu entwickeln, nur wenn der PATH ihn noch nicht enthält
Ändern Sie den letzten Teil in,
echo "$PATH:$ADD_PART"
wenn Sie ADD_PART am Ende von PATH anstatt am Anfang hinzufügen möchten....
... oder um dies noch einfacher zu machen, erstellen Sie ein Skript, das
remove_path_part
mit den Inhalten aufgerufen wirdund ein Skript
prepend_path_part
mit dem Inhalt aufgerufenund ein Skript
append_path_part
mit dem Inhalt aufgerufenmache sie alle ausführbar und rufe sie dann wie folgt auf:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Ordentlich, auch wenn ich es selbst sage :-)
quelle
Viel einfacher ein Liner.
quelle
Es ist eine interessante Übung, eine Bash-Funktion zu schreiben, um ein Verzeichnis aus einer Pfadvariablen zu entfernen.
Im Folgenden sind einige Funktionen aufgeführt, die ich in meinen .bash * -Dateien verwende, um Verzeichnisse an Pfade anzuhängen bzw. ihnen voranzustellen. Sie haben die Eigenschaft, doppelte Einträge zu entfernen und mit jeder Art von durch Doppelpunkte getrennten Pfadvariablen (PATH, MANPATH, INFOPATH, ...) zu arbeiten. Die Funktion remove_from entfernt das Verzeichnis.
quelle
Unten finden Sie überarbeiteten Code aus Greg Tarsas Lösung. Hier werden nur Bash-Befehle verwendet. Auf diese Weise werden viele Systemaufrufe für fork () gespart.
quelle
Um die akzeptierte Antwort von Tushar zu vervollständigen / zu verbessern, können Sie:
-e
Option gemäß der Manpage sed weg: "Wenn keine Option -e, --expression, -f oder --file angegeben ist, wird das erste Argument, das keine Option ist, als zu interpretierendes sed-Skript verwendet."g
(globale) Flag, um alle Vorkommen zu entfernenAm Ende gibt es so etwas:
quelle
Die aktuellen Antworten lösen mein ähnliches Problem nicht, da ich mehrere Pfade entfernen muss. Alle diese Pfade sind Unterverzeichnisse eines einzelnen Verzeichnisses. In diesem Fall funktioniert dieser Einzeiler für mich: (Angenommen, das Muster
cygwin
entfernt alle darin enthaltenen Pfade.cygwin
)quelle