Zmienna $ SHLVL służy do informowania o tym, ile powłok jest głęboka. Jeśli jesteś zdezorientowany przez to, to warto zacząć od początku.
Co to jest powłoka?
Powłoka przyjmuje komendy i przekazuje je do systemu operacyjnego, który ma wykonać. W większości systemów linuksowych program powłoki nosi nazwę BASH (The Bourne Again Shell), ale są też inne dostępne, w tym powłoki C Shell (tcsh) i powłoki KORN (ksh).
Jak uzyskać dostęp do powłoki systemu Linux
Generalnie, jako użytkownik, wchodzisz w interakcję z programem powłoki za pomocą programu emulującego terminal, takiego jak XTerm, konsole lub gnome-terminal.
Jeśli używasz menedżera systemu Windows, takiego jak Openbox lub środowiska graficznego, takiego jak GNOME lub KDE, znajdziesz emulator terminala z menu lub myślnika. W wielu systemach skróty CTRL ALT i T również otwierają okno terminala.
Alternatywnie możesz przełączyć się na inny TTY (teleprogram), który zapewnia bezpośredni dostęp do powłoki linii poleceń. Możesz to zrobić, naciskając CTRL ALT i F1 lub CTRL ALT i F2 itd.
Co to jest poziom powłoki
Po uruchomieniu polecenia w powłoce działa na poziomie zwanym poziomem powłoki. W powłoce możesz otworzyć inną powłokę, która tworzy podpowłokę lub powłokę, która je otworzyła.
Dlatego powłoka nadrzędna byłaby uważana za powłokę poziomu 1, a powłoka podrzędna byłaby powłoką poziomu 2.
Jak wyświetlić poziom powłoki
Nie powinno być niespodzianką na podstawie tytułu artykułu, że sposób, w jaki można stwierdzić, na którym poziomie powłoki jest uruchomiony, jest za pomocą zmiennej $ SHLVL.
Aby zobaczyć poziom powłoki, na którym obecnie pracujesz wpisz:
echo $ SHLVL
Co ciekawe, jeśli uruchomisz powyższe polecenie w oknie terminala, możesz być zaskoczony tym, że zwracany wynik to 2.
Jeśli jednak uruchomisz tę samą komendę za pomocą tty, otrzymasz wynik 1.
Dlaczego tak można zapytać? Cóż, środowisko pulpitu, które uruchamiasz, działa na powłoce. Powłoka będzie miała poziom 1. Każde okno terminala, które otworzysz w tym środowisku, musi być dzieckiem powłoki, która otworzyła środowisko pulpitu i dlatego poziom powłoki nie może zaczynać się od numeru innego niż 2.
Tty nie działa w środowisku graficznym i dlatego jest po prostu powłoką poziomu 1.
Jak utworzyć podpowłoki
Najprostszy sposób przetestowania koncepcji powłok i podpowłok jest następujący. Otwórz okno terminala i wpisz:
echo $ SHLVL
Jak wiemy z okna terminala, minimalny poziom powłoki wynosi 2.
Teraz w oknie terminala wpisz:
sh
Polecenie sh samo uruchamia interaktywną powłokę, co oznacza, że używasz powłoki w powłoce lub podpowłoce.
Jeśli teraz wpiszesz ponownie:
echo $ SHLVL
Zobaczysz, że poziom powłoki jest ustawiony na 3. Uruchomienie polecenia sh z podpórki spowoduje otwarcie podpowłoki podpowłok, a więc poziom powłoki będzie na poziomie 4.
Dlaczego poziom powłoki jest ważny?
Poziom powłoki jest ważny, gdy myślisz o zakresie zmiennych w twoich skryptach.
Zacznijmy od czegoś prostego:
pies = maisieecho $ dog Jeśli uruchomisz powyższe polecenie w powłoce, słowo maisie pojawi się w oknie terminala. Otwórz nową powłokę, wpisując: sh Jeśli uruchomisz to polecenie, zobaczysz, że nic nie jest zwracane: echo $ dog Jest tak dlatego, że zmienna $ dog jest dostępna tylko na poziomie powłoki 2. Jeśli wpiszesz exit, aby wyjść z podpowłoki i ponownie uruchomić echo $ dog, słowo maisie pojawi się ponownie. Warto także zastanowić się nad zachowaniem zmiennych globalnych w powłoce. Rozpocznij w nowym oknie terminala i wpisz: eksportuj psa = maisieecho $ dog Jak można się spodziewać, pojawi się słowo maisie. Teraz otwórz podpowłokę i ponownie wpisz echo $ dog. Tym razem zobaczysz, że słowo maisie jest wyświetlane, nawet jeśli jesteś w podpowłoce. Powodem tego jest to, że polecenie eksportu spowodowało globalną zmienną $ dog. Zmiana zmiennej $ dog w podpowłoce, nawet jeśli użyjesz polecenia eksportu, nie ma wpływu na jego powłoki nadrzędne. Mam nadzieję, że z tego wynika, że znajomość poziomu powłoki, nad którą pracujesz ma pewne znaczenie przy pisaniu skryptów. Podane przeze mnie przykłady są bardzo uproszczone, ale dość często jeden skrypt powłoki wywołuje inny skrypt powłoki, który z kolei wywołuje inny skrypt powłoki, z których wszystkie działają teraz na różnych poziomach. Znajomość poziomu powłoki może być bardzo ważna.




