erlug
[Top] [All Lists]

Re: [Erlug] bash: export

To: erlug@xxxxxxxxxxxxxx
Subject: Re: [Erlug] bash: export
From: Davide Bolcioni <w7dmotu6hjru1001@xxxxxxxxxxxxxx>
Date: Sun, 02 Jun 2002 14:52:07 +0200
LiZ the wiZ linux@xxxxxxxxxxxx [mlerlug/Lista ERLUG] wrote:

#!/bin/sh
# Prova di export
MIAVAR=HELLO
export $MIAVAR

export MIAVAR

La definizione delle variabili nella shell usa il *nome* e il carattere

$ introduce l'operazione di *interpolazione testuale* del contenuto
della variabile. Esistono infatti, in particolare in bash, variazioni di
tale operazione di interpolazione nella forma ${VAR}. A titolo di
confronto invece Perl usa sempre un carattere apposito per fare
riferimento a una variabile e l'operazione di interpolazione è invece
implicita nel contesto.


Domanda:   perché la visibilità della variabile MIAVAR è interna solo
allo script? se lo lancio e poi dopo faccio echo $MIAVAR non ho niente?
Risposta?  Suppongo perché export funziona solo con i processi figli e
non parent giusto?


Più in generale, le variabili di ambiente per scelta di progetto vengono

impostate in un processo e sono disponibili soltanto ai processi figli.

La nozione di variabili di ambiente esiste in un solo punto: la chiamata
di sistema execve(2), che prende come argomenti *due* array di puntatori
a char, uno per gli argomenti e uno per le variabili di ambiente.

Sopra execve() la shell e la tradizione Unix hanno costruito la nozione

delle variabili di ambiente: il codice riceve gli argomenti e costruisce
delle strutture dati che tengono traccia delle variabili di ambiente.

Nel caso dei programmi C, tale codice risiede nel run time inserito dal
compilatore: lo stesso codice che calcola argc, un dato che execve() non
fornisce.

Tali strutture dati sono utilizzate per implementare ad esempio getenv()
e vengono modificate dall'implementazione di putenv() e simili. Dato che
fork() duplica il processo, tali strutture dati sono duplicate senza che
occorra alcuno sforzo specifico; se al fork() segue exec(), tale
funzione chiamerà execve() premurandosi di costruire un array adeguato
a partire da tali strutture dati e nel far ciò trasmetterà al processo
figlio le modifiche fatte nel padre con putenv().

Un programma in C ha modo di avere le variabili che gli occorrono senza

sforzi particolari; la shell nel costruire le variabili usa strutture
dati analoghe a quelle che usa per le variabili di ambiente, e quindi
ha senso che ciascuna variabile abbia un bit che indica "di ambiente"
oppure no. A ciò si riduce export.


Domanda:  Allora perché quando è infilata in .bashrc (o .profile) ha una
visibilità come variabile di ambiente? Risposta? Suppongo perché viene chiamata da bash (quando dopo login?)


Ad ogni invocazione; vedi bash(1).


Domanda LA PIÙ IMPORTANTE: Come si fa a impostare una variabile di
ambiente (aka visibile una volta terminato il processo)


La si imposta nel processo in cui si desidera usare il valore. Se il

problema sta nel fatto che occorre un processo figlio per calcolare
il valore, si può usare:

  MIAVAR=`figlio`

oppure in bash

  MIAVAR=$(figlio)

con o senza export; in tal caso la variabile prende come valore il
testo mandato in output dal figlio.

Davide Bolcioni
--
Paranoia is a survival asset.








<Prev in Thread] Current Thread [Next in Thread>