Ważne jest, aby zrozumieć, że każdy proces ma swój własny zestaw zmiennych środowiskowych.
Kiedy proces wywołuje fork()wywołanie systemowe, tworzony jest drugi proces ( dziecko ) identyczny z pierwszym ( rodzicem ) (ta kopia obejmuje środowisko, które znajduje się tuż nad stosem (lub tuż poniżej, w zależności od tego, jak myślisz o stosach :-)- ale w UNIX / Linux stos rośnie w dół od wysokich adresów).
Zwykle proces potomny wywołuje wówczas wywołanie execve()systemowe, które wyrzuca wszystko z jego (wirtualnej) pamięci i rekonstruuje go z sekcji kodu i danych w określonym pliku binarnym.
Jednak, gdy rekonstruuje stos, kopiuje execve()najpierw środowisko i ciągi argumentów przekazane na stos (w tej kolejności), przed wywołaniem main()funkcji (duża część pracy jest wykonywana w crt0kodzie bootstrap po execve()powrocie (do wpisu) punkt określony w pliku binarnym)).
W execve()bibliotece C znajdują się opakowania dla wywołania systemowego, które przekażą bieżące środowisko (tj. Kopię środowiska nadrzędnego ), zamiast wywołującego go (tak więc dziecko odziedziczy środowisko nadrzędne) - patrz environ(7).
Spróbuj uruchomić (jako root) polecenie ps axeww | less... pokaże to środowisko dla wszystkich procesów! Interesującym jest proces id 1 (tj. initProces - pierwszy proces utworzony przez jądro w czasie rozruchu).
Jeśli chcesz spojrzeć na środowisko dla określonego procesu (i wiesz, że jest to identyfikator procesu), spróbuj uruchomić komendę cat /proc/<PID>/environ(zastępując <PID>go identyfikatorem procesu).
Zauważ, że jeśli proces ma wystarczającą liczbę uprawnień, może przepisać własny stos, co może utrudnić ustalenie, jakie jest jego środowisko - na wyjściu ps zobaczysz niektóre takie procesy demonów.
Ale w końcu cały ten wafel sprowadza się do tego, co powiedział @chaos powyżej, jeśli chcesz spojrzeć na bieżącą wartość konkretnej zmiennej środowiskowej w procesie powłoki, po prostu użyj polecenia (wbudowanego) echo "$<NAME>"(zastępując <NAME>ją nazwą zmienna środowiskowa, którą jesteś zainteresowany) ... pamiętaj, że ta sama zmienna może mieć inną wartość lub może nie istnieć w innym procesie.
echojest złym wyborem polecenia, ponieważ mogłoby przekształcić zawartość zmiennej. Wyśle zawartość parametru powłoki o tej samej nazwie. To nie jest taka sama w przypadku korzystania z Bourne shell lub env vars jak1,*na przykład. I nie można użyć tego podejścia do zmiennych env, których nazwa nie jest poprawna jako nazwa zmiennej powłoki.