Globale omgevingsvariabelen in een shellscript

Hoe stel je een globale omgevingsvariabele in een bash-script in?

Als ik dingen doe zoals

#!/bin/bash
FOO=bar

…of

#!/bin/bash
export FOO=bar

…de vars lijken in de lokale context te blijven, terwijl ik ze graag wil blijven gebruiken nadat het script is uitgevoerd.


Antwoord 1, autoriteit 100%

Voer je script uit met .

. myscript.sh

Hierdoor wordt het script in de huidige shell-omgeving uitgevoerd.

exportbepaalt welke variabelen beschikbaar zijn voor nieuwe processen, dus als je zegt

FOO=1
export BAR=2
./runScript.sh

dan zal $BARbeschikbaar zijn in de omgeving van runScript.sh, maar $FOOniet.


Antwoord 2, autoriteit 38%

Als u een shellscript uitvoert, wordt dit gedaan in een subshell, zodat het de omgeving van de bovenliggende shell niet kan beïnvloeden. U wilt het script sourcen door te doen:

. ./setfoo.sh

Dit voert het uit in de context van de huidigeshell, niet als een subshell.

Van de bash man-pagina:

. bestandsnaam [argumenten]
bronbestandsnaam [argumenten]

Lees en voer commando’s uit van bestandsnaam in de huidige shell
omgeving en retourneer de afsluitstatus van de laatst uitgevoerde opdracht
van bestandsnaam.

Als bestandsnaam geen schuine streep bevat, worden bestandsnamen in PATH gebruikt om:
zoek de map met de bestandsnaam.

Het gezochte bestand in PATH hoeft niet uitvoerbaar te zijn. Wanneer bash niet is
in POSIX-modus wordt de huidige map doorzocht als er geen bestand wordt gevonden
in PAD.

Als de sourcepath-optie naar de ingebouwde opdracht shopt is uitgeschakeld,
het PATH wordt niet gezocht.

Als er argumenten worden opgegeven, worden dit de positionele parameters
wanneer bestandsnaam wordt uitgevoerd.

Anders blijven de positionele parameters ongewijzigd. De retourstatus:
is de status van de laatste opdracht die binnen het script is afgesloten (0 indien nee
commando’s worden uitgevoerd), en false als de bestandsnaam niet wordt gevonden of niet kan
gelezen worden.


Antwoord 3, autoriteit 7%

source myscript.shis ook mogelijk.

Beschrijving voor linux-opdracht source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

Antwoord 4, autoriteit 3%

#!/bin/bash
export FOO=bar

of

#!/bin/bash
FOO=bar
export FOO

man exporteren:

De shell zal het export-attribuut geven aan de variabelen die overeenkomen met de gespecificeerde namen, waardoor ze in de omgeving van later uitgevoerde commando’s zullen zijn. Als de naam van een variabele wordt gevolgd door = woord, dan wordt de waarde van die variabele ingesteld op woord.


Antwoord 5

FOO=bar
export FOO

Other episodes