Ви насправді потрапили на правильний термін¹. Існує змінна середовище, 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.