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