Jag skapade en miljövariabel i ett terminalfönster och försökte eka det i ett annat terminalfönster. Det visade ingenting.

$TEST=hello 

Därefter exporterade jag det och försökte igen echo det i ett annat terminalfönster . resultatet var samma som tidigare.

export TEST 

men om jag kör samma kod vid inloggningen (lägger till koden till ~/.profile fil) variabler kan användas i vilket terminalfönster som helst. Vad är det som händer här? Vad är skillnaden mellan att köra en kod i en terminal och att köra samma vid inloggningen?

Svar

export gör en variabel till något som kommer att ingå i underprocessmiljöer. Det påverkar inte andra redan befintliga miljöer. I allmänhet finns det inget sätt att ställa in en variabel i en terminal och få den att visas automatiskt i en annan terminal. Miljön är skapad för varje process på egen hand.

Lägg till den i din .profile gör det så att din miljö kommer att konfigureras för att inkludera den nya variabeln varje gång du loggar in. Så det exporteras inte från ett skal till ett annat utan istället instruerar ett nytt skal att inkludera den när den ställer in den ursprungliga miljön.

Svar

Varje process har flera attribut som processen kan ställa in individuellt och oberoende av andra processer. Exempel är resursbegränsningar, umask, aktuell katalog, miljövariabler och några fler. Vid processskapande (via fork() systemanrop) ärver barnet dessa attribut från föräldern. Efter detta kan barnprocessen ställa in dessa attribut godtyckligt. (Vissa begränsningar gäller, en process kanske inte ökar gränserna för hårda resurser eller ändrar dess nuvarande katalog till en katalog som den inte har något exec-tillstånd för.)

Endast få program ändrar sina miljövariabler, de flesta bryr sig inte Antag det sistnämnda fallet. Så om en barnprocess skapar sig ytterligare barn, kommer dessa processer att ha samma miljövariabler som farföräldern. Och så vidare.

Nu har ett skal många variabler som kan ses med set (i skal av Bourne Shell-typ, dunno om C Shell). Dessa variabler är inte miljövariabler om de inte är export red. Miljövariabler kan ses med env. Om du startar ett program från skalkommandoraden ärver programmet miljövariablerna från skalet. Likaså för ett program som startas från ett skalskript.

Därför finns det vid inloggningen ett skal som läser profildata (t.ex. ~/.profile) och ärver dem till så gott som alla barn, barnbarn och så vidare. Så här sipprar miljövariabelinställningarna ner från inloggningsskalet eller inloggningsskriptet till alla andra program som startas inom inloggningssessionen.

Jag skapade en miljövariabel i ett terminalfönster och försökte eka det i ett annat terminalfönster. Det visade ingenting.

Enligt ovanstående förklaring är detta det förväntade resultatet. Förändringar i en processmiljö påverkar endast barn av denna process som framöver skapas, inte existerande.

$TEST=hello

Det är osannolikt att det fungerar ändå, såvida inte variabel expansion är inaktiverad eller $TEST redan har en lämpligt värde. Om du vill tilldela hello till variabel TEST måste du säga TEST=hello (not : ingen $).

Efter det exporterade jag det och försökte igen att echo det i ett annat terminalfönster. resultatet var samma som tidigare.

Återigen är detta det förväntade resultatet.

men om jag kör samma kod vid inloggningen (lägger till koden i ~/.profile -fil) kan variabler användas i vilket terminalfönster som helst.

Detta beror på att skalet i terminalen är en ättling till skalet som läste miljöinställningarna från ~/.profile och därmed ärvde dessa inställningar.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *