Létrehoztam egy környezeti változót az egyik terminálablakban, és megpróbáltam visszhangozni egy másik terminálablakban. Ez nem mutatott semmit.
$TEST=hello
Ezt követően exportáltam, és újra megpróbáltam echo
egy másik terminálablakban . eredmény ugyanaz volt, mint korábban.
export TEST
de ha ugyanazt a kódot hajtom végre a bejelentkezéskor (a kód hozzáfűzése a ~/.profile
file) változók bármely terminálablakban használhatók. Mi történik itt? Mi a különbség a kód terminálban történő végrehajtása és a bejelentkezéskor történő végrehajtása között?
Válasz
export
egy változóval készít valamit, amely bekerül a gyermek folyamat környezeteibe. Nem érinti a már létező más környezeteket. Általában nincs mód arra, hogy egy változót beállítson egy terminálba, és hogy automatikusan megjelenjen egy másik terminálon, a környezet minden folyamathoz önmagában jön létre.
Hozzáadva a úgy állítja be, hogy a környezeted be legyen állítva az új változó felvételével minden bejelentkezéskor. Tehát nem exportálódik egyik héjból a másikba, hanem egy új héjat utasít, hogy tartalmazza akkor, amikor beállítja a kezdeti környezetet.
Válasz
Minden folyamatnak több attribútuma van, amelyeket a folyamat külön-külön és függetlenül beállíthat egyéb folyamatok. Ilyenek például az erőforráskorlátok, az umask, az aktuális könyvtár, a környezeti változók és még néhány. A folyamat létrehozásakor (a fork()
rendszerhívás útján) a gyermek ezeket az attribútumokat örökli a szülőtől. Ezt követően a gyermekfolyamat tetszőlegesen beállíthatja ezeket az attribútumokat. (Bizonyos korlátozások érvényesek, előfordulhat, hogy egy folyamat nem növeli a kemény erőforrások korlátjait, vagy az aktuális könyvtárat olyan könyvtárra változtatja, amelyre nincs exec engedélye.)
Csak néhány program módosítja környezeti változóit, a legtöbb nem zavarja Tegyük fel, hogy ez utóbbi eset van. Tehát, ha egy gyermekfolyamat további gyermekeket hoz létre, akkor ezeknek a folyamatoknak ugyanazok a környezeti változói lesznek, mint a nagyszülőnek. És így tovább.
Most egy héjban sok olyan változó található, amelyek megtekinthető a set
címmel (Bourne Shell típusú kagylókban, a C Shellről nem). Ezek a változók nem környezeti változók, hacsak nem export
szerk. A környezeti változókat a env
segítségével lehet megtekinteni. Ha egy programot a shell parancssorából indít, a program örökli a környezeti változókat a shellből. Hasonlóképpen, a egy shell szkript.
Ezért a bejelentkezéskor van egy shell, amely beolvassa a profil adatait (pl. ~/.profile
) és gyakorlatilag minden gyermeknek, unokának és így tovább örökli őket. Így csepegnek le a környezeti változó beállításai a bejelentkezési héjból vagy a bejelentkezési parancsfájlból a bejelentkezési munkameneten belül indított összes többi programba.
Létrehoztam egy környezeti változót itt: az egyik terminálablakot, és megpróbálta visszhangozni egy másik terminálablakban. Ez nem mutatott semmit.
A fenti magyarázat szerint ez a várt eredmény. A folyamat környezetében bekövetkező változások csak a folyamatban lévő, mostantól létrehozott gyermekeket érintik, a meglévőeket nem.
$TEST=hello
Ez valószínűleg nem fog működni, hacsak a változó bővítése le van tiltva, vagy ha $TEST
már rendelkezik megfelelő érték. Ha a hello
-t hozzá kívánja rendelni a TEST
változóhoz, akkor azt kell mondania, hogy TEST=hello
(megjegyzés : nem $
).
Ezt követően exportáltam, és újra megpróbáltam a
echo
egy másik terminálablakban. eredmény ugyanaz volt, mint korábban.
Még egyszer: ez a várt eredmény.
de ha ugyanazt a kódot hajtom végre a bejelentkezéskor (a kód hozzáfűzése a
~/.profile
fájlhoz) változók bármilyen terminálablakot használhatnak.
Ez azért van, mert a terminál héja a héj leszármazottja, amely a környezeti beállításokat ~/.profile
-ből olvassa le, és így örökölte ezeket a beállításokat.