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
$$