¿Cómo saber el "nivel" de conchas en el que estoy?

32

Si abro una terminal como xtermtendré un shell. Entonces si lo uso ssho zshtendré otro "nivel" de shell. ¿Hay alguna manera de saber cuántas veces tengo que Ctrl+Describir o escribir exitpara salir de todos? Mi verdadera intención es salir de todo excepto el shell "raíz".

También será bueno saber qué efecto (s) tienen los multiplexores terminales (como screen) en la solución.

PD: No dudes en cambiar el título, no sé si esos son los términos correctos.

phunehehe
fuente

Respuestas:

6

Una forma (ciertamente no perfecta) es agregar el resultado ps --no-headers -o comm $PPIDa su indicador de shell. Esto le dirá el nombre del proceso que generó su shell. Si estás dentro de un zsh anidado, dirá "zsh". Si está dentro de un zsh de nivel superior, leerá "xterm" o "pantalla" o lo que sea que esté ejecutando su shell.

Para saber si está dentro de una sesión ssh o su, simplemente puede mirar la parte del nombre de host y el nombre de usuario de su solicitud.

Cuando ejecutas pantallas anidadas (lo cual no me imagino que sea una situación común), no hay forma de pensar si estás en el nivel superior de una pantalla anidada o en el nivel superior. de la pantalla de nivel superior. Puede configurar la pantalla para mostrar siempre una línea de estado, lo que provocaría que se muestren varias líneas de estado, si está en pantallas anidadas.

sepp2k
fuente
Aaah ... chasquido ... me ganó. :) +1
Stefan
Actualmente estoy en una Mac y el comando me dio ps: illegal option -- -, ¿alguna idea de por qué? Lo
probaré
3
@phunehehe: --option-namees principalmente una característica específica de GNU, por lo que no está disponible en las utilidades de sistema estándar fuera de Linux. Pero puede obtener el efecto de ps --no-headersportabilidad agregando =después del nombre de la columna. Además, la commcolumna no es POSIX, pero sí la cmdcolumna (que incluye los argumentos del comando). También -pes necesario antes del PID en la sintaxis POSIX. Por ps -o cmd= -p $PPIDlo tanto, es portátil y proporciona información similar.
Gilles 'SO- deja de ser malvado'
confirmado, trabaja en Gentoo
phunehehe
2
@phunehehe: lo siento, cometí un error en el comentario anterior. De hecho, la commcolumna está especificada por POSIX y documentada en Mac OS X, mientras que la cmdcolumna existe en Linux pero no es estándar.
Gilles 'SO- deja de ser malvado'
37

De hecho, has encontrado el término correcto¹. Hay una variable de entorno SHLVLque todos los shells interactivos principales (bash, tcsh, zsh) se incrementan en 1 cuando comienzan. Entonces, si comienzas un shell dentro de un shell, SHLVLaumenta en 1

Sin embargo, esto no responde directamente a su preocupación, ya que SHLVLtransfiere cosas como emuladores de terminal. Por ejemplo, en mi configuración típica, $SHLVLes 2 en un xterm, porque el nivel 1 corresponde al shell que ejecuta mi sesión X ( ~/.xinitrco ~/.xsession).

Lo que hago es mostrar $SHLVLen mi indicador, pero solo si el proceso padre del shell es otro shell (con heurística como "si su nombre termina en shmá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$PPIDproducir resultados distintos. Puede restablecer manualmente SHLVLa 1 en estos shells, o establecer el suyo propio TERMSHLVLen 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.

Gilles 'SO- deja de ser malvado'
fuente
Gracias por confirmar el plazo. Todavía estoy en una Mac y me sorprende ver que esos 2 comandos dan el mismo resultado, independientemente de mi nivel de shell.
phunehehe
@phunehehe: ¿qué 2 comandos? Si quiere decir ps -o tty= -p$pid, esto muestra el terminal de control del proceso, que identifica el emulador de terminal (xterm, screen, sshd, ...) en el que se está ejecutando el proceso. No cambiará si inicia un shell desde otro shell, pero cambiará si usted iniciar un nuevo emulador de terminal. Si el emulador de terminal es una aplicación nativa de Mac, puede haber una sutileza específica de Mac que desconozco.
Gilles 'SO- deja de ser malvado'
ps -o tty= -p$$ y ps -o tty= -p$PPID , porque dijiste que deberían producir resultados diferentes. ¿O entendí mal algo?
phunehehe
@phunehehe: Dan resultados diferentes cuando el proceso padre del shell es un emulador de terminal, porque el emulador de terminal no tiene su terminal emulada como terminal de control. Si encuentra lo contrario, publique el resultado de ps -p $$ -p $PPID(nuevamente, no tengo experiencia en OSX, por lo que tal vez haya algo inusual en OSX).
Gilles 'SO- deja de ser malvado'
@Gilles: eso fue de hecho algo inusual con OSX. Probé en Gentoo y todo fue correcto como dijiste. En OSX, ps -p $$ -p $PPIDda (lo siento, no sé cómo formatear los comentarios) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe
1

No es muy elegante, pero puede usar la vista de árbol en htop para ver la relación padre-hijo de su shell con otros procesos en ejecución.

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

Y úselo para deducir la cantidad de proyectiles que necesitará para salir, antes de llegar al intérprete "raíz"

Stefan
fuente
1

Puede usar la variable de entorno SHLVL :

echo "$SHLVL"
Alex
fuente
1
Si usa, sshpor ejemplo, para la misma cuenta, esto seguirá siendo1
Anthon
0

encontré eso

$ pstree -u | grep ${USER}

puede ser bastante útil para ver dónde "encajo" en un sistema. Lo prefiero por encima pstree -u ${USER}.

Ocasionalmente me recordará que dejé un nohuptrabajo en ejecución o similar.

(Además, yo uso alias grep='grep --color=auto').

J H
fuente