Zdá se, že Bash rozlišuje mezi proměnnými, které byly exportovány, a těmi, které ne.
příklad:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set vidí proměnnou ale env ne.
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set vidí obě proměnné kromě env vidí pouze exportovanou proměnnou.
Tu set znám je vestavěný bash a env není.
Jaké jsou rozdíly mezi proměnnými, které jsou exportovány, a těmi, které nejsou?
Přijatá odpověď:
Exportované proměnné jsou přenášeny do prostředí příkazů prováděných shellem, který je exportoval, zatímco neexportované proměnné jsou lokální pro aktuální vyvolání shellu. Z export manuálová stránka:
Shell dá proměnným odpovídajícím zadaným jménům atribut export, což způsobí, že budou v prostředí následně prováděných příkazů.
set zobrazuje aktuální prostředí, které zahrnuje všechny lokální neexportované proměnné. env se používá ke spouštění programů v novém prostředí a bez argumentů vypíše, jaké by toto nové prostředí bylo. Od env vytváří nové prostředí, jsou přeneseny pouze exportované proměnné, jako je tomu v případě jakéhokoli programu spouštěného z tohoto shellu. Například vytvoření druhého shellu v rámci prvního (použil jsem $$ reprezentovat výzvy ve vnitřním shellu):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Všimněte si, že jde o proměnnou, která se exportuje, nejen o její hodnotu. To znamená, že jakmile export FOO , FOO se stane globální proměnnou a zobrazí se v následujících prostředích, i když se později změní:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$