A veces hago cosas como comenzar un sub-shell desde vim con :sh
. ¿Cómo sé si estoy en un sub-shell donde exit
solo me devolverá un nivel, en lugar de estar en el shell más externo donde exit
cerraré 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
-s
que 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
:csh
ytcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
eso está realmentedash
en 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
~/.profile
archivo y agregue la siguiente línea en la parte inferior:Cree el archivo
~/.shrc
con el siguiente contenido, la notaksh
también lee el$ENV
:Referencias
.profile
y.kshrc
Cree 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/depth
Edite el archivo con su editor favorito y agregue las siguientes líneas como su contenido:
El script anterior tiene dos opciones
-v
o--verbose
que 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 0
oexit 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
su
osudo -i
están involucrados:Cuando se inicia un proceso en segundo plano:
fuente
systemd───xfce4-terminal───bash───pstree
. ¿Por qué es así?xfce4-terminal
, que lanzó unbash
shell, 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 ..$SHLVL
no 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,pstree
es parte del paquete psmisc que también proporcionafuser
,killall
y algunos otros, es el componente principal de Ubuntu, no lo he instalado en los sistemas mencionados en esta respuesta.Verifique el valor de la
SHLVL
variable de shell:Citando de
bash
la página del manual:También es apoyado por
zsh
.fuente
:sh
creo que el valor predeterminado es el shell de inicio de sesión del usuario (en realidad es una forma abreviada en:shell
lugar del nombre de un binario de shell específico):sh
desdevim
antes 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$SHLVL
ajustar$PS1
, agregando "+
" signos a mi$SUBSHELL
variable: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
ps
sin 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 aps
sí mismo, pero puede darle una estimación aproximada de cuán profundo es.fuente
{ echo hello world; ps; } &
para probar laps
respuesta anterior.