Ich frage mich, wo ein neuer Pfad zur PATH
Umgebungsvariablen hinzugefügt werden muss. Ich weiß, dass dies durch Bearbeiten .bashrc
(zum Beispiel) erreicht werden kann, aber es ist nicht klar, wie dies getan werden soll.
Diesen Weg:
export PATH=~/opt/bin:$PATH
oder dieses?
export PATH=$PATH:~/opt/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, kann ein anderer hinzugefügt werden, indem mit einem: zPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Antworten:
Das einfache Zeug
oder
Je nachdem, ob Sie
~/opt/bin
am Ende hinzufügen möchten (um nach allen anderen Verzeichnissen gesucht zu werden, falls es in mehreren Verzeichnissen ein gleichnamiges Programm gibt) oder am Anfang (um vor allen anderen Verzeichnissen gesucht zu werden).Sie können mehrere Einträge gleichzeitig hinzufügen.
PATH=$PATH:~/opt/bin:~/opt/node/bin
oder abweichungen von der bestellung funktionieren einwandfrei. Nichtexport
am Anfang der Zeile einfügen, da dies zusätzliche Komplikationen mit sich bringt (siehe unten unter „Hinweise zu anderen Muscheln als Bash“).Wenn Ihr
PATH
System aus vielen verschiedenen Komponenten besteht, werden möglicherweise doppelte Einträge angezeigt. Weitere Informationen finden Sie unter So fügen Sie den Pfad des Basisverzeichnisses hinzu, der von Unix ermittelt werden soll. und Entfernen Sie doppelte $ PATH-Einträge mit dem Befehl awk , um zu vermeiden, dass Duplikate hinzugefügt oder entfernt werden.Einige Distributionen fügen
~/bin
Ihren PATH übrigens automatisch hinzu, falls vorhanden.Wo soll ich es hinstellen?
Setzen Sie die zu ändernde Zeile
PATH
ein~/.profile
, oder setzen Sie sie ein,~/.bash_profile
wenn Sie dies möchten.Beachten Sie, dass
~/.bash_rc
dies von keinem Programm gelesen wird und dass~/.bashrc
es sich um die Konfigurationsdatei interaktiver Instanzen von bash handelt. Sie sollten keine Umgebungsvariablen in definieren~/.bashrc
. Der richtige Ort zum Definieren von Umgebungsvariablen wiePATH
ist~/.profile
(oder~/.bash_profile
wenn Sie sich nicht für andere Shells als bash interessieren). Siehe Was ist der Unterschied zwischen ihnen und was soll ich verwenden?Setzen Sie es nicht in
/etc/environment
oder~/.pam_environment
: Dies sind keine Shell-Dateien, Sie können keine Ersetzungen wie$PATH
dort verwenden. In diesen Dateien können Sie eine Variable nur überschreiben, nicht jedoch hinzufügen.Mögliche Komplikationen bei einigen Systemskripten
Dies ist nicht erforderlich,
export
wenn sich die Variable bereits in der Umgebung befindet. Jede Änderung des Werts der VariablenPATH
wirkt sich auf die Umgebung aus. Alle Unix-Systeme haben es sehr früh eingestellt (normalerweise sogar im ersten Prozess).Bei der Anmeldung können Sie sich darauf verlassen, dass Sie sich
PATH
bereits in der Umgebung befinden und einige Systemverzeichnisse enthalten. Wenn Sie ein Skript schreiben, das möglicherweise vorzeitig ausgeführt wird, während Sie eine virtuelle Umgebung einrichten , müssen Sie möglicherweise sicherstellen, dassPATH
es nicht leer und exportiert ist: WennPATH
es immer noch nicht gesetzt ist, wird etwas wie auf und die leere Komponente gesetzt am anfang steht das aktuelle verzeichnis (like ).PATH=$PATH:/some/directory
PATH
:/some/directory
.:/some/directory
Anmerkungen zu anderen Muscheln als Bash
In bash, ksh und zsh,
export
ist eine spezielle Syntax, und beidePATH=~/opt/bin:$PATH
undexport PATH=~/opt/bin:$PATH
das Richtige zu tun , auch. In anderen Bourne / POSIX-Shells wie dash (/bin/sh
auf vielen Systemen) wirdexport
es als gewöhnlicher Befehl analysiert, der zwei Unterschiede impliziert:~
wird nur am Anfang eines Wortes analysiert, mit Ausnahme von Zuweisungen (weitere Informationen finden Sie unter So fügen Sie den Pfad des Basisverzeichnisses hinzu, der von Unix ermittelt werden soll, mit welchem Befehl? ).$PATH
außerhalb doppelter Anführungszeichen , wennPATH
Leerzeichen oder\[*?
.So in Shells wie Bindestrich,
setztexport PATH=~/opt/bin:$PATH
PATH
auf die Zeichenkette~/opt/bin/:
mit dem Wert , gefolgt vonPATH
auf den ersten Platz.PATH=~/opt/bin:$PATH
(eine bloße Aufgabe) erfordert keine Anführungszeichen und tut das Richtige. Wenn Sieexport
in einem portablen Skript verwenden möchten , müssen Sie schreibenexport PATH="$HOME/opt/bin:$PATH"
oderPATH=~/opt/bin:$PATH; export PATH
(oderPATH=$HOME/opt/bin:$PATH; export PATH
aus Gründen der Portabilität auch auf die Bourne-Shell, die keineexport var=value
Tilde-Erweiterung akzeptiert hat).¹ Bei Bourne-Shells stimmte dies nicht (wie bei der eigentlichen Bourne-Shell, nicht bei modernen POSIX-Shells), aber es ist sehr unwahrscheinlich, dass Sie heutzutage auf solche alten Shells stoßen.
quelle
export
..bashrc
. Ich gehe davon aus, dass FZF auch in Rust geschrieben ist und dem Muster von Rust folgt.So oder so funktioniert es, aber sie tun nicht dasselbe: Die Elemente von
PATH
werden von links nach rechts überprüft. In Ihrem ersten Beispiel haben ausführbare Dateien in~/opt/bin
Vorrang vor den installierten Dateien , z. B. in/usr/bin
, die Ihren Wünschen entsprechen oder nicht.Insbesondere unter Sicherheitsaspekten ist es gefährlich, Pfade nach vorne hinzuzufügen, da jemand, der Schreibzugriff auf Ihr
~/opt/bin
Konto erhalten kann, beispielsweise ein anderesls
darin ablegen kann, das Sie dann wahrscheinlich stattdessen verwenden würden von/bin/ls
ohne es zu merken. Stellen Sie sich nun das Gleiche fürssh
oder Ihren Browser oder Ihre Wahl vor ...quelle
ls
sie in ein Verzeichnis vorlegen/bin
.Ich bin durch Frage 2 verwirrt (da aus der Frage entfernt, da dies auf ein nicht damit zusammenhängendes Problem zurückzuführen ist):
Wenn du sagst
Das ist alles , was in deinem WEG sein wird. PATH ist nur eine Umgebungsvariable. Wenn Sie dem PATH etwas hinzufügen möchten, müssen Sie die Variable mit genau dem gewünschten Inhalt neu erstellen. Das heißt, was Sie als Beispiel für Frage 2 geben, ist genau das, was Sie tun möchten, es sei denn, ich verpasse den Punkt der Frage völlig.
Ich benutze beide Formulare in meinem Code. Ich habe ein generisches Profil, das ich auf jedem Computer installiere, auf dem ich arbeite. Es sieht folgendermaßen aus, um potenziell fehlende Verzeichnisse zu berücksichtigen:
quelle
Die kugelsichere Art des Anhängens / Vorbereitens
Bei der Wahl zwischen Anhängen und Voranstellen sind viele Überlegungen zu berücksichtigen. Viele von ihnen werden in anderen Antworten behandelt, deshalb werde ich sie hier nicht wiederholen.
Ein wichtiger Punkt ist, dass, selbst wenn Systemskripte dies nicht verwenden (ich frage mich, warum) * 1 , die kugelsichere Methode zum Hinzufügen eines Pfads (z. B.
$HOME/bin
) zur Umgebungsvariablen PATH lautetzum Anhängen (anstelle von
PATH="$PATH:$HOME/bin"
) undzum Voranstellen (statt
PATH="$HOME/bin:$PATH"
)Dies vermeidet den falschen vorderen / hinteren Doppelpunkt, wenn er
$PATH
anfangs leer ist, was unerwünschte Nebenwirkungen haben und zu einem schwer zu findenden Albtraum werden kann ( diese Antwort behandelt kurz den Fall desawk
Weges).Erklärung (aus Shell Parameter Expansion ):
Somit
${PATH:+${PATH}:}
wird erweitert zu: 1) nichts, wennPATH
null oder nicht gesetzt ist, 2)${PATH}:
wennPATH
gesetzt ist.Hinweis : Dies ist für die Bash.
* 1 Ich habe gerade festgestellt, dass Skripte wie diese
devtoolset-6/enable
tatsächlich verwenden,quelle
Linux bestimmt den ausführbaren Suchpfad mit der
$PATH
Umgebungsvariablen.$PATH
Verwenden Sie Folgendes, um das Verzeichnis / data / myscripts am Anfang der Umgebungsvariablen hinzuzufügen :Verwenden Sie den folgenden Befehl, um dieses Verzeichnis am Ende des Pfads hinzuzufügen:
Die vorhergehenden sind jedoch nicht ausreichend, da diese Änderung nur innerhalb des Skripts wirksam wird, wenn Sie eine Umgebungsvariable innerhalb eines Skripts festlegen. Es gibt nur zwei Möglichkeiten, um diese Einschränkung zu umgehen:
Beispiele:
Inklusion bezieht grundsätzlich das "aufgerufene" Skript in das "aufrufende" Skript ein. Es ist wie ein #include in C. Also ist es innerhalb des "aufrufenden" Skripts oder Programms wirksam. Aber natürlich ist es in Programmen oder Skripten, die vom aufrufenden Programm aufgerufen werden, nicht wirksam. Damit es in der gesamten Aufrufkette wirksam wird, müssen Sie die Einstellung der Umgebungsvariablen mit einem Exportbefehl verfolgen.
Als Beispiel bezieht das Bash-Shell-Programm den Inhalt der Datei .bash_profile durch Einbeziehung mit ein. Fügen Sie die folgenden 2 Zeilen in .bash_profile ein:
Fügt diese beiden Codezeilen effektiv in das Bash-Programm ein. Daher enthält die Variable $ PATH in bash
$HOME/myscript.sh
und aufgrund der export-Anweisung alle von bash aufgerufenen Programme die geänderte$PATH
Variable. Und da alle Programme, die Sie an einer Bash-Eingabeaufforderung ausführen, von der Bash aufgerufen werden, ist der neue Pfad für alle von der Bash-Eingabeaufforderung aus ausgeführten Aktionen gültig.Um dem Pfad ein neues Verzeichnis hinzuzufügen, müssen Sie das Verzeichnis an die Umgebungsvariable $ PATH in einem in der Shell enthaltenen Skript anhängen oder voranstellen und die
$PATH
Umgebungsvariable exportieren .Mehr Infos hier
quelle
Seit einiger Zeit habe ich mir zwei Funktionen gehalten
pathadd
undpathrm
die Unterstützung bei Hinzufügen von Elementen zu dem Weg , ohne die Notwendigkeit , sich um Doppelungen zu kümmern.pathadd
Es wird ein einzelnes Pfadargument und ein optionalesafter
Argument verwendet, das, falls angegeben, an das ArgumentPATH
angehängt wird, dem es sonst vorangeht.In fast jeder Situation, in der Sie dem Pfad etwas hinzufügen, möchten Sie wahrscheinlich alles, was sich bereits im Pfad befindet, überschreiben. Aus diesem Grund bevorzuge ich standardmäßig.
Fügen Sie diese in ein beliebiges Skript ein, das Sie zum Ändern der PATH-Umgebung verwenden möchten. Dies ist jetzt möglich.
Sie werden garantiert nicht zum Pfad hinzugefügt, wenn er bereits vorhanden ist. Wenn Sie jetzt sicherstellen möchten,
/baz/bat
ist am Start.Jetzt kann jeder Pfad nach vorne verschoben werden, wenn er sich bereits im Pfad befindet, ohne sich zu verdoppeln.
quelle
Ich kann nicht für andere Distributionen sprechen, aber Ubuntu hat eine Datei, / etc / environment, das ist der Standard-Suchpfad für alle Benutzer. Da mein Computer nur von mir verwendet wird, füge ich alle gewünschten Verzeichnisse in meinen Pfad ein, es sei denn, es handelt sich um eine temporäre Ergänzung, die ich in ein Skript eingefügt habe.
quelle
Es gibt einige Situationen, in denen die Verwendung
PATH=/a/b:$PATH
als "falsche" Methode zum Hinzufügen eines Pfads zuPATH
folgenden Elementen angesehen werden kann :PATH
derselben Form befindet.PATH
einer anderen Form befindet (z. B. ein Alias aufgrund der Verwendung von Symlinks oder..
).PATH
wenn andere Einträge in überschrieben werden sollenPATH
.Diese (Nur-Bash) -Funktion erledigt in den oben genannten Situationen das "Richtige" (mit einer Ausnahme, siehe unten), gibt Fehlercodes zurück und druckt nette Nachrichten für Menschen. Die Fehlercodes und Meldungen können deaktiviert werden, wenn sie nicht gewünscht werden.
Die Ausnahme besteht darin, dass diese Funktion keine Pfade kanonisiert, die auf
PATH
andere Weise hinzugefügt wurden. Wenn sich also ein nicht-kanonischer Alias für einen Pfad in befindetPATH
, wird ein Duplikat hinzugefügt. Der Versuch, bereits vorhandene Pfade zuPATH
kanonisieren, ist eine heikle Angelegenheit, da ein relativer Pfad eine offensichtliche Bedeutung hat, wenn er an übergeben wird. Wenn er sichprepath
jedoch bereits im Pfad befindet, wissen Sie nicht, wie das aktuelle Arbeitsverzeichnis lautete, als er hinzugefügt wurde.quelle
$PATH
wie zuvor haben. Was-r
, nein, ich denke , dass relative Pfade in$PATH
sind einfach zu unzuverlässig und seltsam (Ihr Weg jedes Mal ändert Siecd
!) So etwas wie das in einem allgemeinen Werkzeug zur Unterstützung wollen.Für mich (unter Mac OS X 10.9.5) hat das Hinzufügen des Pfadnamens (z. B.
/mypathname
) zur Datei/etc/paths
sehr gut funktioniert.Vor dem Bearbeiten wird
echo $PATH
Folgendes zurückgegeben:Nach dem Bearbeiten
/etc/paths
und Neustarten der Shell wird die Variable $ PATH angehängt/pathname
. Gibt in der Tat Folgendesecho $PATH
zurück:Was passiert ist, ist, dass
/mypathname
an die$PATH
Variable angehängt wurde .quelle
So fügen Sie der
PATH
Umgebungsvariablen einen neuen Pfad hinzu :Für diese Änderung zu jeder Schale aufgebracht werden Sie öffnen, fügen Sie ihn in die Datei , die die Shell beziehen , wenn es aufgerufen wird. In verschiedenen Schalen kann dies sein:
z.B
Sie können den angegebenen Pfad in der obigen Ausgabe sehen.
quelle
Hier ist meine Lösung:
Ein schöner, leichter Einzeiler, der kein Nachlaufen hinterlässt
:
quelle