it-swarm-es.tech

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

Si abro una terminal como xterm tendré un Shell. Entonces, si uso ssh o zsh tendré otro "nivel" de Shell. ¿Hay alguna manera de saber cuántas veces tengo que Ctrl+D o escriba exit para salir de todos ellos? Mi verdadera intención es salir de todo excepto del Shell "raíz".

También será bueno saber qué efectos tienen los multiplexores de terminal (como screen) en la solución.

PD: Siéntase libre de cambiar el título, no sé si esos son los términos correctos.

32
phunehehe

Una forma (ciertamente no perfecta) es sumar el resultado de ps --no-headers -o comm $PPID a su indicador de Shell. Esto le dirá el nombre del proceso que generó su Shell. Si está dentro de un zsh anidado, dirá "zsh". Si está dentro de un zsh de nivel superior, leerá "xterm" o "screen" 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 Prompt.

Cuando está ejecutando pantallas anidadas (que no imagino que sea una situación común), no se me ocurre ninguna manera de saber si está en el Shell de nivel superior de una pantalla anidada o en el Shell de nivel superior de la pantalla de nivel superior. Puede configurar la pantalla para que siempre muestre una línea de estado, lo que provocaría que se mostraran varias líneas de estado si se encuentra en pantallas anidadas.

6
sepp2k

De hecho, ha dado con el término correcto¹. Hay una variable de entorno SHLVL que todos los shells interactivos principales (bash, tcsh, zsh) incrementan en 1 cuando comienzan. Entonces, si inicia un Shell dentro de un Shell, SHLVL aumenta en 1.

Sin embargo, esto no responde directamente a su preocupación, porque 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 Prompt, pero solo si el proceso padre del Shell es otro Shell (con heurísticas 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. Puede hacer esto con bastante precisión: estos son los shells cuyo proceso padre tiene una terminal de control diferente, de modo que ps -o tty= -p$$ y ps -o tty= -p$PPID producir una salida diferente. Puede restablecer manualmente SHLVL a 1 en estos shells, o establecer su propio TERMSHLVL en 1 en estos shells (e incrementar de otra manera).

¹ Aunque uno no lo pensaría mirando las páginas del manual: ninguno de los tres shells que lo soportan incluye el “nivel” de Word en su documentación de SHLVL.

Puede usar la variable de entorno SHLVL :

echo "$SHLVL"
1
Alex

No es muy elegante, pero puede usar 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 utilícelo para deducir la cantidad de shells que necesitará para salir, antes de llegar al Shell "raíz".

1
Stefan

Encontré eso

$ pstree -u | grep ${USER}

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

De vez en cuando me recordará que dejé un trabajo Nohup en ejecución, o similar.

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

0
J_H