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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *