Sie haben tatsächlich den richtigen Begriff1 gefunden. Es gibt eine Umgebungsvariable, SHLVL
die alle wichtigen interaktiven Shells (bash, tcsh, zsh) beim Start um 1 erhöht. Wenn Sie also eine Shell innerhalb einer Shell starten, wird sie SHLVL
um 1 erhöht.
Dies beantwortet Ihr Anliegen jedoch nicht direkt, da SHLVL
es Dinge wie Terminalemulatoren überträgt. In meiner typischen Konfiguration $SHLVL
ist z. B. 2 in einem xterm, da Ebene 1 der Shell entspricht, in der meine X-Sitzung ( ~/.xinitrc
oder ~/.xsession
) ausgeführt wird.
Was ich tue, ist $SHLVL
in meiner Eingabeaufforderung anzuzeigen , aber nur, wenn der übergeordnete Prozess der Shell eine andere Shell ist (mit Heuristiken wie "Wenn sein Name mit sh
optionaler Interpunktion und Ziffern endet , ist es eine Shell"). Auf diese Weise habe ich einen offensichtlichen visuellen Hinweis für den seltenen Fall, dass eine Shell unter einer anderen Shell ausgeführt wird.
Vielleicht möchten Sie lieber Shells erkennen, die direkt unter einem Terminalemulator ausgeführt werden. Sie können dies ziemlich genau tun: Dies sind die Shells, deren übergeordneter Prozess ein anderes steuerndes Terminal hat, so dass ps -o tty= -p$$
und ps -o tty= -p$PPID
unterschiedliche Ausgaben produzieren. Sie können SHLVL
in diesen Shells manuell auf 1 zurücksetzen oder Ihre eigene TERMSHLVL
in diesen Shells auf 1 setzen (und ansonsten erhöhen).
¹ Auch
wenn man es sich auf den Manualseiten nicht vorstellen würde: Keine der drei Shells, die dies unterstützen, enthält das Wort „Level“ in ihrer Dokumentation von SHLVL
.