[Linuxtrent] Re: Variabili d'ambiente

  • From: Lele Gaifax <lelegaifax@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 21 Jul 2010 10:30:29 +0200

On Wed, 21 Jul 2010 09:38:35 +0200
Michele Bert <micbert75@xxxxxxxxx> wrote:

> Ho spulciato un po' il web alla ricerca di approfondimenti a proposito
> delle variabili d'ambiente del web, ma sembra che tutte le trattazioni
> partano da presupposti un po' limitativi.

"Variabili d'ambiente del web"? Cosa intendi?

> Per entrare nello specifico del mio problema (i miei dubbi e curiosità
> spazierebbero ben di più), ogni volta che si parla di variabili
> d'ambiente lo si fa con riferimento ad una shell. Mentre io ho bisogno
> che alla partenza del sistema, in ambiente grafico, siano predefinite
> determinate variabili d'ambiente.
> Ma è proprio vero che il contesto sia esclusivamente quello? Non
> potrebbe un processo qualsiasi andare a leggere il valore di una
> variabile d'ambiente? E in questa situazione, per ogni processo esiste
> usa shell da cui esso discende?

L'"ambiente" è una caratteristica dei processi Unix (ma possibilmente
presente anche in sistemi figli di un dio minore...), di tutti i
processi, indipendentemente che siano lanciati "da una shell" o meno.

Ci sono delle "funzioni primitive", come la "getenv()" e la "putenv()"
che consentono di consultare oppure di alterare l'environment: ogni
processo conserva un proprio ambiente, indipendente e intangibile
dagli altri processi. Alla creazione del processo, la "exec()" prepara
una copia del proprio ambiente e lo aggancia al nuovo processo.

Il fatto che solitamente ci si riferisca alla shell è solo una
questione di praticità e consuetudine: nella stragrande maggioranza
dei casi l'ambiente viene manipolato, a livello utente, dalla shell,
dove viene esposto con le cosiddette "variabili d'ambiente",
generalmente con la sintassi "$nomevariabile". A sua volta la shell ha
un meccanismo con cui può controllare *quali* di queste variabili
siano da considerare "globali" oppure "private": quando la shell crea
un nuovo processo (ad esempio, perché l'utente ha scritto "emacs"
sulla riga di comando e dato l'invio) "passa" al nuovo processo tutte
le variabili marcate "global", e non quelle "local". Dalla riga di
comando di una bash, con "set" ottieni un dump di tutte le variabili
definite nell'ambiente (cioè, sia quelle globali che quello locali),
mentre con "env" (o "printenv") ottieni tutte e sole quelle globali
(cioè quelle che, eseguendo un sottoprocesso, verranno ereditate).

Le varie shell hanno sintassi differenti per gestire le variabili. Ad
esempio la bash:

    $ a=1
    $ echo $a
    1

qui sopra ho definito una nuova variabile "a", con valore "1". Di
default la variabile viene considerata "locale":

    $ set | egrep '^a='
    a=1
    $ env | egrep '^a='
    $

    $ python
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
    [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more
    information. >>> import os
    >>> os.getenv('a')
    >>>

Un sottoprocesso qualsiasi (in questo caso l'interprete Python) non la
vede. Se però torno nella bash, e dichiaro quella variabile "globale":

    $ export a
    $ set | egrep '^a='
    a=1
    $ env | egrep '^a='
    a=1

allora la variabile viene inserita nell'environ di qualsiasi
sottoprocesso:

    $ python
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
    [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more
    information. >>> import os
    >>> os.getenv('a')
    '1'

> A quest'ultima domanda posso già ripondere di no, dal momento che il
> capostipite dell'albero dei processi è "init", il quale lancia diversi
> altri processi che quindi non appartengono ad alcuna shell. Ma cosa mi
> sapete dire dei processi lanciati, ad esempio, dal desktop grafico?

L'origine del processo (cioè, *chi* lo ha lanciato, se una shell
interattiva, o una applicazione grafica) non ha alcun impatto
sull'ambiente.

> qualsiasi indicazione su letture approfondite sull'argomento è bene
> accetta.

Vedi il manuale di environ(7), che a sua volta fa riferimento alle
funzioni primitive clearenv(3), exec(3), getenv(3), putenv(3),
setenv(3), unsetenv(3) che lo controllano. Alla bisogna, consulta
anche la sezione dedicata alle variabili d'ambiente della tua shell
preferita.

ciao, lele.
--
nickname: Lele Gaifax    | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas    | comincerò ad aver paura di chi mi copia.
lele@xxxxxxxxxxxxxxxxxxx |                 -- Fortunato Depero, 1929.

-- 
 nickname: Lele Gaifax  | Se non si ha voglia di far conoscere a
 real: Emanuele Gaifas  | qualcuno quello che si è fatto, forse
lelegaifax at gmail.com | non si doveva farlo affatto. -- Google's CEO
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: