Risposte:
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
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? "
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.