Kiedy sprawdzę środowisko mojego systemu, pojawi się wiele zmiennych środowiskowych. Jak mogę po prostu wyszukać konkretną zmienną?
Książka, którą czytam, mówi:
Czasami liczba zmiennych w twoim środowisku staje się dość duża, tak bardzo, że nie chcesz widzieć wszystkich wartości wyświetlanych, gdy jesteś zainteresowany tylko jedną. W takim przypadku możesz użyć
echo
polecenia, aby wyświetlić bieżącą wartość zmiennej środowiskowej.
Jak to zrobić w terminalu Linux?
command-line
environment-variables
iLearnSlow
źródło
źródło
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.printenv VAR
wyświetli je wszystkie (przynajmniej dla implementacji GNU).Wykonując:
printenv
Zobaczysz wszystkie zmienne środowiskowe. Aby uzyskać więcej informacji, możesz spojrzeć na:
https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps
źródło
printenv
variablename
wyświetli się tylko zmienna nazwana; np.printenv HOME
zrobi mniej więcej to samoecho "$HOME"
.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łaniemmain()
funkcji (duża część pracy jest wykonywana wcrt0
kodzie bootstrap poexecve()
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) - patrzenviron(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.źródło
e
opcjaps
i/proc/…/environ
plik specjalny mogą nie istnieć we wszystkich systemach. (2) AFAIK, każdy proces uniksowy ma uprawnienia do przepisywania stosu i modyfikowania zmiennych środowiskowych. (3) Aby uzyskać więcej dyskusji, zobacz Do kogo należą zmienne środowiskowe? (w przypadku superużytkownika ).ps
… ale teraz, kiedy zaznaczyłeś ten punkt, nie pamiętam, dlaczego ja myślałem, że.Możesz uzyskać to, czego szukasz
export
:Pokaże zawartość
$HOME
zmiennej.źródło
jeśli musisz ustawić wiele wariacji:
po ich ustawieniu:
niż wyświetlić, co zostało ustawione:
W ten sposób wkrótce znajdziesz się w pracy z wieloma zestawami zmiennych powłoki wstępnie zdefiniowanych w plikach cnf, które w połączeniu z tmux uczynią cię mistrzem zarządzania konfiguracją w środowiskach powłoki:
źródło