Tips en Trucs 2014

Export

De export opdracht is een in de bash shell ingebouwd commando, m.a.w. het maakt deel uit van uw shell (terminal). De export opdracht is door zijn duidelijke syntax (schrijfwijze) en drie opties eenvoudig te gebruiken. De export opdracht exporteert variabelen naar daarna opgestarte processen (opdrachten) waardoor dit achteraf gestarte proces deze variabelen ook kan gebruiken. Mocht het nog niet helemaal duidelijk zijn, dan wordt bij het verder lezen van deze tip alles duidelijk.

Veel gebruikte opties

-p
Toont alle in de huidige shell geëxporteerde namen.
-n
Verwijdert namen van de geëxporteerde lijst.
-f
Namen worden als functies geëxporteerd.

De basis

Bekijk het volgende voorbeeld:

dany@linux-55yl:~> pinda=pindanet.be
dany@linux-55yl:~> echo $pinda
pindanet.be
dany@linux-55yl:~> bash
dany@linux-55yl:~> echo $pinda

dany@linux-55yl:~> exit
exitdany@linux-55yl:~>

Bovenstaande voorbeeld leert ons dat een nieuw kind proces dat door een ouder proces wordt opgestart de variabelen niet overerft. Daarvoor hebben we de export opdracht nodig. Het bovenstaande voorbeeld wordt dan:

dany@linux-55yl:~> pinda=pindanet.be
dany@linux-55yl:~> echo $pinda
pindanet.be
dany@linux-55yl:~> export pinda
dany@linux-55yl:~> bash
dany@linux-55yl:~> echo $pinda
pindanet.be
dany@linux-55yl:~> exit
exit
dany@linux-55yl:~>

In de derde opdracht gebruiken we het export commando om de variabele pinda te exporteren. Daardoor blijft bij het starten van een nieuw kind proces de variabele pinda zijn inhoud behouden. Merk echter op dat enkel processen die gestart worden vanuit de terminal die de variabele geëxporteerd heeft, de variabele kan gebruiken. Het kind (child) proces erft dus de geëxporteerde variabelen van het ouder (parent) proces.

Kind en ouder processen

Elk proces is zowel kind als ouder. De enige uitzondering is het systemd proces, met PID (process ID) 1. Systemd is dus ouder van alle op uw Linux systeem draaiende processen.

dany@linux-55yl:~> ps -p 1
  PID TTY          TIME CMD
    1 ?        00:00:00 systemd

Elk proces heeft dus een ouder die het proces heeft gestart en wordt zo het kind van het ouder proces.

dany@linux-55yl:~> echo $$
3704
dany@linux-55yl:~> bash
dany@linux-55yl:~> echo $$
4749
dany@linux-55yl:~> ps --ppid 3704
  PID TTY          TIME CMD
 4749 pts/1    00:00:00 bash
dany@linux-55yl:~> exit
exit

Bij het starten van een kind proces zorgen export commando's dat in het ouder proces geëxporteerde variabelen in het kind proces beschikbaar zijn.

De export opdracht

Gebruik de export opdracht zonder opties of argumenten om een lijst van variabelen weer te geven die bij het starten van een nieuw proces geëxporteerd zullen worden. Hetzelfde resultaat bekom je met de -p optie.

dany@linux-55yl:~> export
declare -x ALSA_CONFIG_PATH="/etc/alsa-pulse.conf"
declare -x AUDIODRIVER="pulseaudio"
declare -x COLORFGBG="15;0"
declare -x COLORTERM="1"

Om een variabele te exporteren gebruiken we de naam van de variabele als argument voor de export opdracht.

dany@linux-55yl:~> MijnVariabele=10
dany@linux-55yl:~> export | grep MijnVariabele
dany@linux-55yl:~> export MijnVariabele
dany@linux-55yl:~> export | grep MijnVariabele
declare -x MijnVariabele="10"

Pas na het exporteren van de variabele MijnVariabele is deze variabele in de lijst met te exporteren variabelen opgenomen. Bovenstaande voorbeeld kan je inkorten door in de export opdracht de variabele te definiëren en een waarde te geven.

dany@linux-55yl:~> export MijnVariabele=10
dany@linux-55yl:~> export | grep MijnVariabele
declare -x MijnVariabele="10"

De meest gebruikte export opdracht is deze om de PATH shell variabele uit te breiden:

dany@linux-55yl:~> export PATH=$PATH:/usr/lib64/jvm/java-1.7.0-openjdk-1.7.0/jre/bin

Deze opdracht voegt de map /usr/lib64/jvm/java-1.7.0-openjdk-1.7.0/jre/bin toe aan de reeds bestaande PATH shell variabele.

Functies exporteren

Met de -f optie kan export ook functies exporteren. Onderstaande voorbeeld maakt een functie printname waarmee we met de echo opdracht pindanet.be op het scherm plaatsen.

dany@linux-55yl:~> printname () { echo "pindanet.be"; }
dany@linux-55yl:~> printname
pindanet.be
dany@linux-55yl:~> export -f printname
dany@linux-55yl:~> bash
dany@linux-55yl:~> printname
pindanet.be
dany@linux-55yl:~> exit
exit

Een variabele van de export lijst verwijderen

Door de voorbeelden hierboven te volgen, heb je nu een variabele MijnVariabele in de export lijst staan.

dany@linux-55yl:~> export | grep MijnVariabele
declare -x MijnVariabele="10"

Om deze variabele van de export lijst te schrappen, gebruiken we de -n export optie.

dany@linux-55yl:~> export | grep MijnVariabele
declare -x MijnVariabele="10"
dany@linux-55yl:~> export -n MijnVariabele
dany@linux-55yl:~> export | grep MijnVariabele
dany@linux-55yl:~>

En verder

Deze tip behandelde het basis gebruik van de export opdracht. Meer informatie kan je opvragen met de opdracht:

dany@linux-55yl:~> man export
man export