De hecho, has encontrado el término correcto¹. Hay una variable de entorno SHLVL
que todos los shells interactivos principales (bash, tcsh, zsh) se incrementan en 1 cuando comienzan. Entonces, si comienzas un shell dentro de un shell, SHLVL
aumenta en 1
Sin embargo, esto no responde directamente a su preocupación, ya que SHLVL
transfiere cosas como emuladores de terminal. Por ejemplo, en mi configuración típica, $SHLVL
es 2 en un xterm, porque el nivel 1 corresponde al shell que ejecuta mi sesión X ( ~/.xinitrc
o ~/.xsession
).
Lo que hago es mostrar $SHLVL
en mi indicador, pero solo si el proceso padre del shell es otro shell (con heurística como "si su nombre termina en sh
más puntuación y dígitos opcionales, es un shell"). De esa manera, tengo una indicación visual obvia en el caso poco común de un shell que se ejecuta bajo otro shell.
Quizás prefiera detectar shells que se ejecutan directamente bajo un emulador de terminal. Usted puede hacer esto con bastante precisión: estos son los depósitos cuyo proceso padre tiene un terminal de control diferente, por lo que ps -o tty= -p$$
y ps -o tty= -p$PPID
producir resultados distintos. Puede restablecer manualmente SHLVL
a 1 en estos shells, o establecer el suyo propio TERMSHLVL
en 1 en estos shells (e incrementado de lo contrario).
¹
Aunque uno no lo pensaría mirando las páginas del manual: ninguno de los tres shells que lo soportan incluye la palabra "nivel" en su documentación de SHLVL
.