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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük