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