A veces hago cosas como comenzar un sub-shell desde vim con :sh. ¿Cómo sé si estoy en un sub-shell donde exitsolo me devolverá un nivel, en lugar de estar en el shell más externo donde exitcerraré la sesión o cerraré mi sesión?
¿Hay algún tipo de tótem de inicio que pueda girar o algo para saber cuántos niveles tengo?
command-line
Wyck
fuente
fuente

echo $0. Si es el shell de nivel superior, probablemente comenzará con un guión. (Esto es cierto al menos para bash, y el guión significa que es un llamado shell de inicio de sesión.)Respuestas:
Puede usar el comando
pstree(que viene por defecto con Ubuntu). Aquí hay un ejemplo: actualmente solo tengo una ventana de terminal abierta en WSL:Dentro de un entorno real de Linux / Ubuntu, el árbol de procesos será más complicado. Podemos filtrar el árbol por la opción
-sque mostrará a los padres de un proceso seleccionado. Entonces, nuestro comando podría serpstree -s $$, donde$$es una variable de entorno que contiene el PID actual:Referencias
Agregue un indicador a la solicitud del shell: según la idea de @ waltinator , para tener un contador al frente de la solicitud para varios shells diferentes cuando el nivel es más profundo que uno, he agregado las líneas, que se muestran debajo de la demostración, en la parte inferior de los archivos de comandos de ejecución (
~/.*rc) relevantes .He realizado pruebas en WSL, Ubuntu 16.04, Ubuntu 18.04 (servidor / escritorio), Ubuntu 19.04, dentro de la sesión gnome-terminal, tty y ssh. Así es como funciona:
La limitación es que: el contador funciona solo para 13-14 niveles de profundidad, dependiendo del sistema operativo. No tengo la intención de investigar las razones :)
bash>.bashrc:cshytcsh>.cshrc:zsh>.zshrc:ksh>.kshrc:sheso está realmentedashen Ubuntu: aquí las cosas son un poco complicadas y están cableadas (lea las referencias a continuación para obtener más información):Edite el
~/.profilearchivo y agregue la siguiente línea en la parte inferior:Cree el archivo
~/.shrccon el siguiente contenido, la notakshtambién lee el$ENV:Referencias
.profiley.kshrcCree un comando que genere la profundidad: otra opción es crear un comando de shell que genere la profundidad. Para este propósito, cree el archivo ejecutable (por lo tanto, debe ser accesible en todo el sistema):
/usr/local/bin/depthEdite el archivo con su editor favorito y agregue las siguientes líneas como su contenido:
El script anterior tiene dos opciones
-vo--verboseque generará una lista de los shells involucrados. Y la otra opción que verificará si la profundidad es mayor que una y, en función de esto, regresaráexit 0oexit 1, para que pueda usarla de esta maneradepth && exit. Aquí hay algunos ejemplos de uso:Comparación con las otras soluciones: pasé un tiempo adicional para descubrir algunas debilidades de los enfoques proporcionados aquí. Pude imaginar los siguientes dos casos (las mayúsculas son necesarias para un mejor resaltado de sintaxis):
Cuando
suosudo -iestán involucrados:Cuando se inicia un proceso en segundo plano:
fuente
systemd───xfce4-terminal───bash───pstree. ¿Por qué es así?xfce4-terminal, que lanzó unbashshell, dentro del cual corristepstree, que se informó a sí mismo y a sus padres. Si te refieres a la falta de pasos entre systemd y xfce4-terminal, podría ser que lo que sea que se haya lanzado xfce4-terminal lo haya muerto o no, en cuyo caso sería heredado por init.SHLVL? Supongo que la portabilidad a través de procesos y sistemas, pero luego pstree no puede instalarse ..$SHLVLno es compatible con algunos shells. Más específicamente, de acuerdo con el entorno de la demostración anterior, no solo es compatible consh(dash), y esta shell no cuenta en absoluto esta shell. Por otro lado,pstreees parte del paquete psmisc que también proporcionafuser,killally algunos otros, es el componente principal de Ubuntu, no lo he instalado en los sistemas mencionados en esta respuesta.Verifique el valor de la
SHLVLvariable de shell:Citando de
bashla página del manual:También es apoyado por
zsh.fuente
:shcreo que el valor predeterminado es el shell de inicio de sesión del usuario (en realidad es una forma abreviada en:shelllugar del nombre de un binario de shell específico):shdesdevimantes de la publicación de esta respuesta, y lo hizo el nivel mínimo de la cáscara para mí. Mi shell de inicio de sesión es bash.En mi
.bashrc, solía$SHLVLajustar$PS1, agregando "+" signos a mi$SUBSHELLvariable:Entonces, puedo ver lo profundo que soy:
fuente
awk:
pgrep:
Puede colocar una de las dos versiones en un archivo y usar la fuente para hacer que $ DEPTH esté disponible.
fuente
Simplemente puede usar
pssin ningún argumento adicional para ver toda la pila de shell (incluida la actual). También mostrará todos los trabajos en segundo plano que ha comenzado, así como apssí mismo, pero puede darle una estimación aproximada de cuán profundo es.fuente
{ echo hello world; ps; } ¶ probar lapsrespuesta anterior.