Ik heb een omgevingsvariabele gemaakt in het ene terminalvenster en geprobeerd deze in een ander terminalvenster weer te geven. Dat toonde niets.

$TEST=hello 

Daarna heb ik het geëxporteerd en opnieuw geprobeerd om echo het in een ander terminalvenster te plaatsen . resultaat was hetzelfde als voorheen.

export TEST 

maar als ik dezelfde code uitvoer bij het inloggen (de code toevoegen aan ~/.profile file) variabelen kunnen in elk terminalvenster worden gebruikt. Wat gebeurt hier? Wat is het verschil tussen het uitvoeren van een code in een terminal en het uitvoeren van dezelfde code bij het inloggen?

Answer

export maakt een variabele iets dat zal worden opgenomen in onderliggende procesomgevingen. Het heeft geen invloed op andere reeds bestaande omgevingen. In het algemeen is er “geen manier om een variabele in de ene terminal in te stellen en deze automatisch in een andere terminal te laten verschijnen, de omgeving wordt voor elk proces afzonderlijk ingesteld.

Door deze toe te voegen aan uw .profile zorgt ervoor dat uw omgeving zo wordt ingesteld dat deze nieuwe variabele elke keer dat u zich aanmeldt, wordt opgenomen. Het wordt dus niet geëxporteerd van de ene shell naar de andere, maar geeft in plaats daarvan instructies aan een nieuwe shell om op te nemen het wanneer het de initiële omgeving instelt.

Answer

Elk proces heeft verschillende attributen die het proces afzonderlijk en onafhankelijk kan instellen andere processen. Voorbeelden zijn resource limieten, umask, huidige directory, omgevingsvariabelen en nog wat meer. Bij het aanmaken van het proces (door middel van de fork() systeemaanroep) erft het kind deze attributen van de ouder. Hierna kan het kindproces deze attributen willekeurig instellen. (Sommige beperkingen zijn van toepassing, een proces mag de limieten van harde bronnen niet verhogen of de huidige directory wijzigen in een directory waarvoor het geen uitvoerende toestemming heeft.)

Slechts enkele programmas wijzigen hun omgevingsvariabelen, de meesten doen er niet aan Stel dat het laatste geval. Dus als een kindproces zichzelf meer kinderen aanmaakt, dan zullen deze processen dezelfde omgevingsvariabelen hebben als de grootouder. Enzovoort.

Nu heeft een shell veel variabelen die kunnen worden bekeken met set (in shells van het Bourne Shell-type, weet niet over C-shell). Deze variabelen zijn geen omgevingsvariabelen tenzij ze export ed. Omgevingsvariabelen kunnen worden bekeken met env. Als u een programma start vanaf de shell-opdrachtregel, zal het programma de omgevingsvariabelen van de shell overnemen. Evenzo voor een programma dat wordt gestart vanuit een shellscript.

Daarom is er bij het inloggen een shell die profielgegevens leest (bijv. ~/.profile) en erft ze aan vrijwel alle kinderen, kleinkinderen enzovoort. Dit is hoe de instellingen van omgevingsvariabelen van de login-shell of het login-script naar alle andere programmas die tijdens de login-sessie worden gestart naar beneden druppelen.

Ik heb een omgevingsvariabele gemaakt in een terminalvenster en probeerde het in een ander terminalvenster weer te geven. Dat toonde niets.

Volgens de bovenstaande uitleg is dit het verwachte resultaat. Veranderingen in de omgeving van een proces zijn alleen van invloed op kinderen van dit proces die voortaan worden gemaakt, niet op bestaande.

$TEST=hello

Het is onwaarschijnlijk dat dit hoe dan ook werkt, tenzij variabele uitbreiding is uitgeschakeld of $TEST al een geschikte waarde. Als je hello wilt toewijzen aan variabele TEST, dan moet je TEST=hello zeggen (opmerking : no $).

Daarna heb ik het geëxporteerd en opnieuw geprobeerd naar echo het in een ander terminalvenster. resultaat was hetzelfde als voorheen.

Nogmaals, dit is het verwachte resultaat.

maar als ik dezelfde code uitvoer bij het inloggen (de code toevoegen aan het ~/.profile -bestand), kunnen variabelen in elk terminalvenster worden gebruikt.

Dit komt omdat de shell in de terminal een afstammeling is van de shell die de omgevingsinstellingen van ~/.profile heeft gelezen en dus deze instellingen heeft geërfd.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *