Was ist der Unterschied und was ist besser, wenn ich mein Bash-Profil anpasse? Dokumentation zu diesem export
Befehl 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 $PATH
ist die gleiche wie in Version 1. env
ist ebenfalls die gleiche.
Also:
- 1) Was ist der Vorteil der Verwendung
export
gegenü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:
export
tutsetzen Sie dies$PATH
explizit.Nein.
export
legt die Umgebung für untergeordnete Prozesse fest,$PATH
ist aber bereits für die aktuelle Umgebung festgelegt. Im zweiten Beispiel wird also beim Einlesen des Befehls - undVorexport
wird ausgeführt – der Wert der aktuellen Umgebung$PATH
wird in das$PATH
Wort erweitert.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 dieexport
eingebautAlso:
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 export
zweimal 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 export
festgelegt haben. Alternativ können Sie nur set -a
einen Teil des Skripts festlegen und set +a
ihn später löschen – es könnte auch als Funktion funktionieren.
Aber Subshells erben Variablenwerte sowieso automatisch, also:
var1=value
( echo "$(echo "$var1")" )
value
export
macht 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, export
und 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 export
eingegebenen 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 ENV
Dateien, die zuerst von einer Shell aufgerufen werden, wie .bashrc
oder , .profile
legen Variablenwerte für die Lebensdauer dieser Shell fest. Alle Variablen, die export
in diesen Dateien festgelegt und bearbeitet werden, behalten diese export
Eigenschaft und werden für export
die Lebensdauer der Shell oder bis sie beendet werden an alle von dieser Shell aufgerufenen Kindprozesse bearbeitet unset
.
Es ist jedoch bemerkenswert, dass bash
die export
integrierte Funktion etwas erweitert wird, um die Option einzuschließen – die es Ihnen ermöglicht, das Attribut aus einer Variablen -n
zu entfernen , ohne es zu beeinflussen, aber dies ist kein portables Verhalten.export
unset
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 export
Ihre 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