Variabile di shell vs. variabile di ambiente, quale è preferibile se entrambi hanno lo stesso nome?


10

Digitando quanto segue in Bash:

env | grep USER

e

set | grep USER

dà ad entrambe le volte lo stesso nome utente.

Come faccio a sapere, ad esempio, quando si digita echo $USERse è stata visualizzata la shell o la variabile di ambiente?

Risposte:


14

Per le shell compatibili con POSIX (incluso Bash), lo standard dice:

2.5.3 Variabili shell Le
variabili devono essere inizializzate dall'ambiente [...] Se una variabile viene inizializzata dall'ambiente, deve essere contrassegnata per l'esportazione immediatamente; vedere lo speciale di esportazione incorporato. Nuove variabili possono essere definite e inizializzate con assegnazioni di variabili, [ecc.]

E su export:

export name[=word]...
La shell fornisce l'attributo di esportazione alle variabili corrispondenti ai nomi specificati, che devono far sì che si trovino nell'ambiente di comandi eseguiti successivamente.

Quindi dal punto di vista della shell, ci sono solo variabili. Alcuni di essi potrebbero provenire dall'ambiente all'avvio della shell e alcuni potrebbero essere esportati nell'ambiente dei processi avviati dalla shell.

(L '"ambiente" è in realtà solo un mucchio di stringhe passate al processo all'avvio. Quando il processo è in esecuzione, può fare tutto ciò che gli piace, usarlo, ignorarlo, sovrascriverlo. E cosa passa un processo quando avviare altri processi può essere ancora un'altra cosa, anche se ovviamente è normale passare di nuovo tutte le variabili di ambiente.)


Se si utilizzava una shell non POSIX, ad esempio csh, le cose potrebbero essere diverse:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit

1
Si noti che la shell Bourne, come csh, inizializza le variabili di shell dalle variabili di ambiente. Ma la modifica delle variabili della shell non influisce sulla variabile d'ambiente corrispondente a meno che non le si esporti. È qualcosa che è stato rotto dalla shell Korn (e specificato da POSIX). Ecco perché dovresti stare attento con il nome delle variabili di shell che usi ora per assicurarti di non modificare vari parametri che potrebbero influenzare i comandi che esegui nel tuo script.
Stéphane Chazelas,

4

Queste sono la stessa variabile. Nella shell, diversamente dalla maggior parte degli altri linguaggi di programmazione, le variabili di ambiente e le variabili di shell condividono lo stesso spazio dei nomi. Nella shell, una variabile di ambiente è una variabile di shell che è stata esportata con export.

Vedi, ad esempio, la mia risposta alla tua domanda precedente " Qual è la differenza nell'uso tra variabili shell e variabili d'ambiente? "


rileggerò la tua spiegazione, solo ho bisogno di imparare alcune cose prima di poter capire la tua risposta.
Sharkant,

@sharkant Nessun problema. Se confondo le cose, dimmelo e cercherò di chiarire. Anche la risposta di ilkkachu è buona.
Kusalananda

no, io non la penso così, hai un buon stile di spiegazione, è solo la mia mancanza di conoscenza che non posso ancora amarli.
Sharkant,

2

Shell Variable può essere utilizzata solo per la shell corrente, non può essere utilizzata a livello di sistema. Dall'altro lato, è possibile utilizzare la variabile ambientale a livello di sistema. Per convenzione, le variabili Shell sono scritte in minuscolo mentre le variabili ambientali sono scritte in maiuscolo. Puoi far funzionare una variabile shell come variabile d'ambiente, devi solo esportarla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.