V jednom okně terminálu jsem vytvořil proměnnou prostředí a pokusil jsem se ji zopakovat v jiném okně terminálu. To nic nezobrazovalo.
$TEST=hello
Poté jsem to exportoval a zkusil to znovu echo
v jiném okně terminálu . výsledek byl stejný jako předtím.
export TEST
ale pokud při přihlášení spustím stejný kód (připojením kódu k ~/.profile
file) lze použít v libovolném terminálovém okně. Co se tady děje? Jaký je rozdíl mezi spuštěním kódu v terminálu a jeho spuštěním při přihlášení?
Odpověď
export
vytvoří z proměnné něco, co bude zahrnuto v podřízených prostředích procesů. Neovlivňuje ostatní již existující prostředí. Obecně neexistuje způsob, jak nastavit proměnnou v jednom terminálu a nechat ji automaticky zobrazit v jiném terminálu, prostředí je vytvořeno pro každý proces samostatně.
Přidání do vašeho .profile
dělá to tak, že vaše prostředí bude nastaveno tak, aby zahrnovalo tuto novou proměnnou pokaždé, když se přihlásíte. Takže to není exportováno z jednoho prostředí do druhého, ale místo toho dává pokyn novému prostředí, aby zahrnovalo to, když nastaví počáteční prostředí.
Odpověď
Každý proces má několik atributů, které lze nastavit individuálně a nezávisle na jiné procesy. Příkladem jsou limity zdrojů, umask, aktuální adresář, proměnné prostředí a některé další. Po vytvoření procesu (prostřednictvím fork()
systémového volání) dítě zdědí tyto atributy od rodiče. Poté může podřízený proces tyto atributy libovolně nastavit. (Platí některá omezení, proces nemusí zvýšit omezení tvrdých prostředků nebo změnit svůj aktuální adresář na adresář, pro který nemá oprávnění ke spuštění.)
Pouze několik programů upravuje své proměnné prostředí, většinou se neobtěžuje . Předpokládejme druhý případ. Pokud si tedy podřízený proces vytvoří další děti, pak tyto procesy budou mít stejné proměnné prostředí jako prarodič. A tak dále.
Nyní má shell spoustu proměnných, které lze zobrazit pomocí set
(ve skořápkách typu Bourne Shell, nevím o C Shell). Tyto proměnné nejsou proměnnými prostředí, pokud nejsou export
ed. Proměnné prostředí lze zobrazit pomocí env
. Pokud spustíte program z příkazového řádku prostředí, program zdědí proměnné prostředí z prostředí. Podobně program spuštěný z skript prostředí.
Proto při přihlášení existuje prostředí, které čte data profilu (např. ~/.profile
) a zdědí je prakticky ke všem dětem, vnoučatům atd. Takto nastavení proměnné prostředí stéká z přihlašovacího prostředí nebo přihlašovacího skriptu do všech ostatních programů spuštěných v rámci relace přihlášení.
Vytvořil jsem proměnnou prostředí v jedno okno terminálu a pokusil se jej zopakovat v jiném okně terminálu. To nezobrazovalo nic.
Podle výše uvedeného vysvětlení se jedná o očekávaný výsledek. Změny v prostředí procesu ovlivní pouze podřízené prvky tohoto procesu, které budou vytvořeny od nynějška, nikoli existující.
$TEST=hello
Je nepravděpodobné, že by to stejně fungovalo, pokud není deaktivováno rozšíření proměnných nebo $TEST
již nemá vhodná hodnota. Pokud chcete hello
přiřadit proměnné TEST
, musíte říct TEST=hello
(poznámka : no $
).
Poté jsem to exportoval a zkusil to znovu na
echo
v jiném okně terminálu. výsledek byl stejný jako předtím.
Toto je opět očekávaný výsledek.
ale pokud při přihlášení spustím stejný kód (přidáním kódu do souboru
~/.profile
), lze použít libovolné okno terminálu.
Je to proto, že shell v terminálu je potomkem shellu, který načetl nastavení prostředí z ~/.profile
a tak zdědil tato nastavení.