domenica 10 febbraio 2008

Variabili di ambiente esportate con export

Molto spesso gli studenti dei corsi di Sistemi Operativi dell'Università degli Studi di Modena e Reggio Emilia mi hanno chiesto chiarimenti circa il funzionamento di export per l'esportazione delle variabili.

Il comando export consente di esportare una variabile definita in un processo shell per i sottoshell che saranno generati da essi. L'esportazione è simile alla semantica della fork(2) quando le variabili sono copiate da un processo padre a quello figlio. Si noti che la copia/esportazione si ha per valore in avanti, ossia dal padre al figlio, e non dai processi figli verso quello padre. In altre parole, al momento dell'export viene copiata la variabile nello shell figlio, ma i due valori restano indipendenti. Questo significa che se lo shell figlio modifica il valore, il padre non vede la modifca. E' facile verificare questo con una coppia di script:

#!/bin/bash
# script1.sh (script padre)

VAR1="variabile1"
echo "Script1 : $VAR1"
export VAR1
./script2.sh
echo "Script1 : $VAR1"


#!/bin/bash
# script2.sh (script figlio)
echo "Script2 : $VAR1"
VAR1="Variabile2"
echo "Script2 : $VAR1"


Come si può notare lo script1.sh definisce una variabile, la esporta, invoca un processo figlio e controlla nuovamente il valore della variabile. L'esecuzione di tale script produce il seguente output:

Script1 : variabile1
Script2 : variabile1
Script2 : Variabile2
Script1 : variabile1

Come si può notare, lo script1.sh vede sempre e solo il valore originale della variabile VAR1, anche se quest'ultima è stata modificata dallo script2.sh. Questo è dovuto proprio al fatto che l'export funziona dal padre al figlio e non viceversa.

Nessun commento: