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.