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 crt0
kodzie 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. init
Proces - 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.
echo
jest 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.