Jeg oprettede en miljøvariabel i et terminalvindue og forsøgte at gentage det i et andet terminalvindue. Det viste intet.

$TEST=hello 

Derefter eksporterede jeg det og prøvede igen at echo det i et andet terminalvindue . resultatet var det samme som før.

export TEST 

men hvis jeg udfører den samme kode ved login (tilføjer koden til ~/.profile fil) kan bruges i ethvert terminalvindue. Hvad sker der her? Hvad er forskellen mellem at udføre en kode i en terminal og at udføre den samme ved login?

Svar

export laver en variabel til noget, der vil blive inkluderet i underordnede procesmiljøer. Det påvirker ikke andre allerede eksisterende miljøer. Generelt er der ikke “en måde at indstille en variabel i en terminal og få den automatisk til at vises i en anden terminal. Miljøet er etableret for hver proces alene.

Tilføjelse til din .profile gør det således, at dit miljø bliver indstillet til at inkludere den nye variabel hver gang du logger ind. Så det eksporteres ikke fra en skal til en anden, men i stedet instruerer en ny skal om at inkludere det, når det opretter det oprindelige miljø.

Svar

Hver proces har flere attributter, som processen kan indstille individuelt og uafhængigt af andre processer. Eksempler er ressourcebegrænsninger, umask, nuværende bibliotek, miljøvariabler og nogle mere. Efter procesoprettelse (ved hjælp af fork() systemopkald) arver barnet disse attributter fra forældren. Efter dette kan barneprocessen indstille disse attributter vilkårligt. (Nogle begrænsninger gælder, en proces kan muligvis ikke øge grænserne for hårde ressourcer eller ændre den aktuelle mappe til en mappe, som den ikke har nogen exec-tilladelse for.)

Kun få programmer ændrer deres miljøvariabler, de fleste gider ikke Antag sidstnævnte tilfælde. Så hvis en barneproces skaber sig selv flere børn, så vil disse processer have de samme miljøvariabler som bedsteforældren. Og så videre.

Nu har en skal mange variabler, som kan ses med set (i skaller af Bourne Shell-type, ved ikke om C Shell). Disse variabler er ikke miljøvariabler, medmindre de er export red. Miljøvariabler kan ses med env. Hvis du starter et program fra shell-kommandolinjen, arver programmet miljøvariablerne fra shell. Ligeledes for et program startet fra et shell-script.

Derfor er der ved login en shell, der læser profildata (f.eks. ~/.profile) og arver dem til stort set alle børn, børnebørn og så videre. Sådan siver miljøindstillinger for miljøvariabler ned fra login-shell eller login-script til alle andre programmer, der er lanceret inden for login-sessionen.

Jeg oprettede en miljøvariabel i et terminalvindue og forsøgte at gentage det i et andet terminalvindue. Det viste intet.

Ved ovenstående forklaring er dette det forventede resultat. Ændringer i miljøet i en proces påvirker kun børn af denne proces, der oprettes fremover, ikke eksisterende.

$TEST=hello

Dette fungerer sandsynligvis alligevel, medmindre variabel udvidelse er deaktiveret, eller $TEST har allerede en passende værdi. Hvis du vil tildele hello til variablen TEST skal du sige TEST=hello (note : ingen $).

Derefter eksporterede jeg det og forsøgte igen at echo det i et andet terminalvindue. resultatet var det samme som før.

Endnu en gang er dette det forventede resultat.

men hvis jeg udfører den samme kode ved login (tilføjer koden til ~/.profile -fil), kan variabler bruges ethvert terminalvindue.

Dette skyldes, at skallen i terminalen er en efterkommer af skallen, der læser miljøindstillingerne fra ~/.profile og dermed arvede disse indstillinger.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *