W rzeczywistości trafiłeś na właściwy termin¹. Istnieje zmienna środowiskowa, SHLVL
której wszystkie główne interaktywne powłoki (bash, tcsh, zsh) zwiększają o 1 podczas uruchamiania. Więc jeśli uruchomisz powłokę wewnątrz skorupy, SHLVL
zwiększy się o 1.
Nie odpowiada to jednak bezpośrednio na twoje obawy, ponieważ SHLVL
przenosi takie rzeczy jak emulatory terminali. Na przykład w mojej typowej konfiguracji $SHLVL
jest 2 w xterm, ponieważ poziom 1 odpowiada powłoce, która uruchamia moją sesję X ( ~/.xinitrc
lub ~/.xsession
).
To, co robię, to wyświetlenie $SHLVL
w wierszu polecenia, ale tylko wtedy, gdy proces macierzysty powłoki jest inną powłoką (z heurystyką typu „jeśli jej nazwa kończy się na sh
plus interpunkcja i cyfry, to powłoka”). W ten sposób mam wyraźne wskazanie wizualne w rzadkim przypadku pocisku działającego pod inną powłoką.
Być może wolisz wykryć powłoki działające bezpośrednio pod emulatorem terminala. Możesz to zrobić dość dokładnie: są to powłoki, których proces macierzysty ma inny terminal kontrolny, więcps -o tty= -p$$
i ps -o tty= -p$PPID
produkować innego wyjścia. Możesz ręcznie zresetować SHLVL
do 1 w tych powłokach lub ustawić własny TERMSHLVL
na 1 w tych powłokach (w innym przypadku zwiększyć).
¹
Chociaż nie można by pomyśleć, że patrzy się na strony podręcznika: żadna z trzech powłok, które ją obsługują, nie zawiera słowa „poziom” w ich dokumentacji SHLVL
.