Festlegen von PATH vs. Exportieren von PATH in ~/.bash_profile

Festlegen von PATH vs. Exportieren von PATH in ~/.bash_profile

Was ist der Unterschied und was ist besser, wenn ich mein Bash-Profil anpasse? Dokumentation zu diesem exportBefehl ist spärlich, da es sich um einen integrierten Befehl handelt.

Auszug aus Version 1 meines ~/.bash_profile:

#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

Ausgabe von:echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin

Auszug aus Version 2:

#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

Die Ausgabe von echo $PATHist die gleiche wie in Version 1. envist ebenfalls die gleiche.

Also:

  • 1) Was ist der Vorteil der Verwendung exportgegenüber der expliziten Festlegung von PATH?
  • 2) Gibt es bei der Anwendung einen funktionalen Unterschied zwischen Version 1 und Version 2?
  • 3) Was sollte ich verwenden und warum?

Antwort1

Um Ihre Fragen konkret zu beantworten:

  1. export tutsetzen Sie dies $PATHexplizit.

  2. Nein. exportlegt die Umgebung für untergeordnete Prozesse fest, $PATHist aber bereits für die aktuelle Umgebung festgelegt. Im zweiten Beispiel wird also beim Einlesen des Befehls - undVor exportwird ausgeführt – der Wert der aktuellen Umgebung $PATHwird in das $PATHWort erweitert.

  3. Sie sollten das verwenden, was für Sie notwendig und/oder bequem ist. Funktional macht beides keinen Unterschied, es handelt sich also in erster Linie um eine Frage des Stils.

POSIX definiert dieexporteingebautAlso:

Die Shell muss den Variablen, die den angegebenen Namen entsprechen, das Attribut zuweisen export, das sie in die Umgebung der nachfolgend ausgeführten Befehle einordnet. Wenn auf den Namen einer Variablen folgt= Wort, dann wird der Wert dieser Variable gesetzt aufWort.

Von einem anderen meinerAntworten:

Es gibt kaum einen Unterschied zwischen der Deklaration einer Shell-Variable und einer Umgebungsvariable. Da „export“ ein eingebautes Attribut ist, deklariert es eine Umgebungsvariable für den nächsten aufgerufenen Prozess. Wenn Sie jedoch keine aufrufen, bleibt dieser Prozess die Shell, und Ihre Variable wird daher zweimal ausgewertet.

Sie können alle Exporte entfernen, ohne dass dies Auswirkungen auf die exportierten Variablen hat, solange Sie nicht exportzweimal auswerten. Mit zweimal auswerten meine ich:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

Verwenden Sie stattdessen einfach:

set -a 

...am Anfang des Skripts. Alle danach definierten Variablen werden automatisch festgelegt exported– einschließlich Variablen, die Sie möglicherweise vorher nicht exportfestgelegt haben. Alternativ können Sie nur set -aeinen Teil des Skripts festlegen und set +aihn später löschen – es könnte auch als Funktion funktionieren.

Aber Subshells erben Variablenwerte sowieso automatisch, also:

var1=value
( echo "$(echo "$var1")" )
value

exportmacht in diesem Fall keinen Unterschied.

Wenn Ihr Skript jedoch ein anderes Skript oder eine andere ausführbare Datei aufruft, die die von Ihnen eingegebenen Werte interpretiert, exportund Sie diese beenden export, sind diese Werte in ihrer Umgebung nicht mehr verfügbar. Im folgenden Beispiel verwende ich die Shell-Variable $PS1, die den Inhalt der Eingabeaufforderung einer interaktiven Shell definiert, um zu demonstrieren, wie sich Variationen der exporteingegebenen Variablen auf untergeordnete Prozesse auswirken.

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

Aber ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

Wenn Sie jedoch beim Aufrufen eines Prozesses Umgebungsvariablen explizit deklarieren ...

PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}

###OUTPUT###

this is another executable
 > exit
exit
sh-4.3$ exit
exit

Alle ENVDateien, die zuerst von einer Shell aufgerufen werden, wie .bashrcoder , .profilelegen Variablenwerte für die Lebensdauer dieser Shell fest. Alle Variablen, die exportin diesen Dateien festgelegt und bearbeitet werden, behalten diese exportEigenschaft und werden für exportdie Lebensdauer der Shell oder bis sie beendet werden an alle von dieser Shell aufgerufenen Kindprozesse bearbeitet unset.

Es ist jedoch bemerkenswert, dass bashdie exportintegrierte Funktion etwas erweitert wird, um die Option einzuschließen – die es Ihnen ermöglicht, das Attribut aus einer Variablen -nzu entfernen , ohne es zu beeinflussen, aber dies ist kein portables Verhalten.exportunset

Antwort2

Hier ist ein ähnlicher Thread.

Eine kurze Antwort:

https://superuser.com/a/153378/333431

Exportierte Variablen werden an untergeordnete Prozesse weitergegeben, nicht exportierte Variablen nicht.

Dies bedeutet, dass Sie exportIhre Variablen löschen sollten, wenn Sie sie in Subshells verwenden möchten.

Sie können dies testen:

$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here

verwandte Informationen