Вы действительно нашли правильный термин ». Существует переменная среды, в SHLVL
которой все основные интерактивные оболочки (bash, tcsh, zsh) увеличиваются на 1 при запуске. Так что если вы запускаете оболочку внутри оболочки, SHLVL
увеличивается на 1.
Однако это не отвечает вашим интересам, потому что SHLVL
переносит такие вещи, как эмуляторы терминала. Например, в моей типичной конфигурации значение $SHLVL
2 в xterm, потому что уровень 1 соответствует оболочке, которая выполняет мой сеанс X ( ~/.xinitrc
или ~/.xsession
).
Что я делаю, так это отображаю $SHLVL
в моем приглашении, но только если родительский процесс оболочки - это другая оболочка (с эвристикой типа «если ее имя заканчивается sh
плюс необязательные знаки пунктуации и цифры, это оболочка»). Таким образом, у меня есть очевидная визуальная индикация в необычном случае оболочки, запущенной под другой оболочкой.
Может быть, вы бы предпочли обнаружить оболочки, которые работают непосредственно под эмулятором терминала. Вы можете сделать это довольно точно: эти оболочки которых родительский процесс имеет другой контрольный терминал, так что ps -o tty= -p$$
и ps -o tty= -p$PPID
производить различную продукцию. Вы можете вручную сбросить SHLVL
до 1 в этих оболочках или установить свой собственный TERMSHLVL
в 1 в этих оболочках (и увеличить в противном случае).
¹
Хотя никто бы не подумал, что смотрит на страницы справочника: ни одна из трех оболочек, которые его поддерживают, не включает слово «уровень» в документацию SHLVL
.