Was bedeutet export PATH = something: $ PATH?

27

Ich bin sehr neu in Linux und füge den folgenden Befehl am Ende der Datei .profilein meinen Home-Ordner ein:

export PATH="~/.composer/vendor/bin:$PATH"

Ich kenne die Probleme mit Umgebungsvariablen und deren Werten ein wenig aus Windows, aber in diesem Fall möchte ich verstehen, was dieser Befehl bewirkt und welche Teile er umfasst:

  1. Was ist diese "Export" -Phrase am Anfang? Exportiert es die Daten, um für Bash verfügbar zu sein?

  2. Was ist die erste PATHund was ist die zweite $PATHund warum brauchen wir zwei?

JohnDoea
quelle
Abgesehen von einigen technischen Unterschieden zwischen den Betriebssystemen entspricht dies diesem Prozess unter Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist
1
"export" macht die Änderung für neue Programme sichtbar, die von bash gestartet wurden.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: nein, das passiert unabhängig davon, ob Sie den exportBefehl verwenden oder nicht , da die PATHVariable bereits als exportiert markiert ist. (Versuchen Sie es in beide Richtungen, wenn Sie mir nicht glauben!)
David

Antworten:

39

Was ist diese "Export" -Phrase am Anfang?

exportist ein Befehl (genauer gesagt, es ist ein in Bash integrierter Befehl , dh es ist keine ausführbare Datei PATH, sondern ein von Bash selbst integrierter Befehl).

Exportiert es die Daten, um für Bash verfügbar zu sein?

exportSetzt die Umgebungsvariable auf der linken Seite der Zuweisung auf den Wert auf der rechten Seite der Zuweisung. Eine solche Umgebungsvariable ist für den Prozess, der sie festlegt, und für alle Unterprozesse in derselben Umgebung sichtbar, dh in diesem Fall für die Bash-Instanz, die die Quelle ist, ~/.profileund für alle Unterprozesse in derselben Umgebung (zu denen z. B. auch andere Shells gehören können) , auf die wiederum zugegriffen werden kann).

Was ist die erste PATHund was ist die zweite $PATHund warum brauchen wir zwei?

Die erste, PATHwie oben erläutert, ist die Umgebungsvariable, die mit festgelegt werden soll export.

Da PATHnormalerweise etwas enthalten ist, wenn ~/.profilees von einer Quelle stammt (standardmäßig enthält es /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), können Sie einfach festlegen PATH, ~/.composer/vendor/bindass make PATHnur enthält ~/.composer/vendor/bin.

Da also Verweise auf eine Variable in einem Befehl durch den Wert der Variablen durch Bash zum Zeitpunkt der Auswertung des Befehls ersetzt (oder "erweitert" werden) , :$PATHwerden sie an das Ende des Werts gesetzt, dem sie zugewiesen werden sollen, PATHso dass PATHsie ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( dh was PATHenthält schon plus ~/.composer/vendor/bin:am anfang).

kos
quelle
Tolle Erklärung.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables wird Ihnen wahrscheinlich helfen. Auch man bashkann sehr hilfreich sein , mit dem Verständnis , wie das funktioniert (zumindest in Bash)

Wie auch immer - wie für PATH= Sie im Grunde genommen die PATHVariable festlegen, einige neue Pfade zum Durchsuchen hinzufügen und am Ende bereits festgelegte / zuvor festgelegte Pfade hinzufügen $PATH(was im Grunde genommen eine Referenz auf die PATHVariable ist).

Angenommen, Sie PATHwaren bisher auf Folgendes eingestellt:

PATH="x:y:z"

und dann setzt du

PATH="a:b:c:$PATH"

Ihre PATH danach wird wie folgt sein:

a:b:c:x:y:z

Ich hoffe das ergibt Sinn.

Außerdem exportieren Sie die neue Variable, damit sie in Ihrer Umgebung bekannt ist, einschließlich der untergeordneten Prozesse / Subshells.

Beachten Sie bitte auch, dass die Reihenfolge der Verzeichnisse PATHwichtig sein kann. Und so etwas PATH="$PATH:a:b:c"gibt dir das Ergebnis:

x:y:z:a:b:c

Dies wirkt sich auf die Reihenfolge der Verzeichnisse / Pfade bei der Suche nach einem Befehl aus (wenn Sie Ihren Befehl in mehr als einem der Verzeichnisse haben, wird der zuerst gefundene verwendet - was manchmal zu unerwarteten Ergebnissen führen kann).

Jacek
quelle
2

Hier ist der Befehl, damit jeder mitmachen kann, während er die Aufzählungspunkte durchläuft. export PATH="~/.composer/vendor/bin:$PATH"

  • exportDer eingebaute /bin/exportShell-Befehl (das heißt, es gibt keinen , es ist eine Shell-Sache) macht Umgebungsvariablen für andere aufgerufene Programme bash(siehe die verknüpfte Frage in Extra Reading) und die Subshells verfügbar.
  • Die Zuweisung in der Shell wird zuerst erweitert, dann wird die Zuweisung an zweiter Stelle erfolgen. Was in doppelten Anführungszeichen steht, wird zuerst erweitert und PATHspäter in einer Variablen gespeichert .
  • $PATHist die Standardzuweisung PATH(oder zumindest, wie die Variable aussieht, bis dieser Befehl in Ihrem .bashrcoder erscheint .profile), und erweitern Sie sie.
  • ~/.composer/vendor/binwird erweitert /home/username/.composer/vendor/bin, wo der .composerOrdner aufgrund des führenden Punktes versteckt ist.
  • Diese kurzen ~/.composer/vendor/bin:$PATHhaben sich jetzt in eine lange Liste von Ordnern verwandelt, getrennt durch :. Alles ist in doppelte Anführungszeichen eingeschlossen, sodass wir Ordner mit Leerzeichen in ihren Pfad aufnehmen.
  • Schließlich wird alles in PATHVariablen gespeichert und externe Befehle dürfen es verwenden

Einfaches Beispiel

Meine interaktive Shell ist eigentlich mksh, die zufällig auch exporteingebaut hat. Mit exportset VARkann meine Variable an eine nachfolgende Kette von Befehlen / Unterprozessen übergeben und von diesen verwendet werden. Dort habe ich dieselbe Variable exportiert

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Zusätzliches Lesen

Sergiy Kolodyazhnyy
quelle
3
Nein, das ~In ~/.composer/vendor/binwird nicht erweitert! Die Tilde wird nur an wenigen Stellen erweitert, etwa direkt nach dem =Schild. PATH="~/.foo:$PATH"Ergebnisse in ~/.foo:/other/path/dirs.... Aber ~würde erweitert werden PATH=~"/.foo:$PATH"in, die Ergebnisse /home/user/.foo:/other/path/dirs....
Volker Siegel
2

Ich habe hier und an anderen Stellen im Internet gelesen, mit einem Freund darüber gesprochen und beschlossen, dass ich als Neuling (vielleicht eher ein Ubuntu-Neuling als manche hier) diesen Befehl abbilden sollte - ich sollte eine Map erstellen und So lernst du, worum es geht und wo du dich befindest:

Vorläufige Daten

Wenn Sie im Moment etwas in diesem Kapitel nicht verstanden haben - keine Sorge, es wird klarer, wenn Sie weiterlesen. Um diese Angelegenheit zu verstehen, müssen Sie jedoch Umgebungsvariablen (EVs), ihre Werte und ihren Zweck lesen . Ich werde nun versuchen, den Befehl in einfachen Worten und in einer Mapping-Methode für Neulinge wie mich und nur für Neulinge zu erklären. Versucht mein Bestes zu geben ...

Kartierung

export PATH="~/.composer/vendor/bin:$PATH"

Der ursprüngliche Wert des EV "PATH", wie er in Ubuntu 15.10 enthalten ist, ist:

/usr/bin:/usr/sbin

Im Befehl selbst haben wir zwei PATH-Phrasen. Der letzte ist $ PATH - Der $ sagt "drucke den ursprünglichen Wert oder die Werte des EV neben dir"; Das EV daneben ist das PATH EV.

Wir haben die Pfadvariable selbst exportiert (sie wurde auch für Unterprozesse verfügbar gemacht, dh für IE-Prozesse, die in der CLI ausgeführt werden, die eigentlich nicht die Bash-Shell sind, sondern in der CLI ausgeführt werden (z. B. Drush , die Drupal- CLI).

Neben dem Export haben wir ihn auch erweitert: Mit der ersten PATH-Phrase (PATH =) haben wir dem ursprünglichen Wert (dargestellt durch $ PATH) einen zusätzlichen Wert (~ / .composer / vendor / bin :) hinzugefügt.

  • Der Doppelpunkt (:) am Ende des neuen Werts, den ich oben erwähnt habe, dient dazu, den neuen Wert vom ursprünglichen Wert zu unterscheiden.

  • Das "" ist der Bereich, in dem sich der Wert / die Werte befinden.

  • Das ~ ist der Home-Ordner.


Ich hoffe, dass der Befehl nach dieser Zuordnung für Neulinge wie mich klarer wird.

JohnDoea
quelle
1

Der exportBefehl stellt Variablen in Unterschalen zur Verfügung. Das heißt, ohne sie PATHwäre die Variable in Subshells nicht sichtbar.

PATH wird zweimal erwähnt:

  • Als Variable wird der Wert links vom =Vorzeichen zugewiesen .
  • Als Variablenname, der durch seinen Wert rechts vom =Vorzeichen ersetzt wird. Dadurch wird der alte Wert Teil des neuen Werts.
rexkogitans
quelle
1
"Das heißt, ohne sie PATHwäre die Variable in Subshells nicht sichtbar." Das ist falsch; Da PATHes sich um eine Umgebungsvariable handelt (die nicht mit einer Shell- Variablen identisch ist ), wird sie automatisch exportiert, und der exportBefehl ist nicht erforderlich.
David
Die Bourne-Shell-Familie unterscheidet nicht wirklich zwischen Shell- und Umgebungsvariablen. ( sc.tamu.edu/help/general/unix/vars.html ) Auf meinem System (Arch Linux) kennt bash den setenvBefehl nicht einmal .
Rexkogitans
1
Es gibt immer noch einen Unterschied zwischen Umgebungsvariablen, die dem Kernel bekannt sind, und Shell-Variablen, die für bash intern sind. Da es PATHaus der Umgebung stammt, wird es automatisch exportiert, sodass Sie keine exportÄnderungen vornehmen müssen, um sie auf untergeordnete Prozesse zu übertragen (im Gegensatz zu der von Ihnen verlinkten Seite).
David
Umgebungsvariablen sind keine Eigenschaft des Kernels, sondern des Prozesses. Da der Prozess, über den wir hier sprechen, sh, bash ist (verwendet Ubuntu zsh?), Denke ich, dass wir sie gleich Shell-Variablen lassen können. Natürlich werden Shell-Variablen nicht wie Umgebungsvariablen an zufällige Programme übergeben.
rexkogitans
Ich denke, wir sind an diesem Punkt in der Semantik festgefahren. Alles, was ich sagen wollte, war, dass in der Bash PATH=foound export PATH=foohaben das gleiche Verhalten.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. die exporteine buildin Befehl bas ist, bedeutet exportieren Variablen envirement variabel sein. (Sie könnten tippen, help exportum mehr zu lernen

    (Die Zeichen, die dem Befehl folgen, sind durch Leerzeichen aufgeteilte Parameter. In diesem Fall gibt es also nur einen Parameter.)

  2. das PATHist der Name der Variablen, in der Regel, vordefinierte Varibale von bash, in Großbuchstaben benannt werden.

  3. Das =Mittel weist dieser Variablen einen Wert zu.

  4. Die gesamte Zeichenfolge ist der Wert der Variable

  5. das $PATHist eine Art von funciton von bash, mit dem Namen variable expantion, bash den Wert des exist ersetzen wird PATHim Parameter - String, bevor die Zeichenfolge senden exportBefehl

  6. Die :Variable in einem Sonderzeichen in PATH wird von allen Anwendungen verstanden, die diese Variable verwenden möchten. es bedeutet Trenner. Sie haben also viele Verzeichnisse in der PATH-Variablen.

Liebesfeder
quelle