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.

ps: illegal option -- -, ¿alguna idea de por qué? Lo--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 deps --no-headersportabilidad agregando=después del nombre de la columna. Además, lacommcolumna no es POSIX, pero sí lacmdcolumna (que incluye los argumentos del comando). También-pes necesario antes del PID en la sintaxis POSIX. Porps -o cmd= -p $PPIDlo tanto, es portátil y proporciona información similar.commcolumna está especificada por POSIX y documentada en Mac OS X, mientras que lacmdcolumna existe en Linux pero no es estándar.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 1Sin 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 enshmá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$$yps -o tty= -p$PPIDproducir resultados distintos. Puede restablecer manualmenteSHLVLa 1 en estos shells, o establecer el suyo propioTERMSHLVLen 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.fuente
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.ps -o tty= -p$$yps -o tty= -p$PPID, porque dijiste que deberían producir resultados diferentes. ¿O entendí mal algo?ps -p $$ -p $PPID(nuevamente, no tengo experiencia en OSX, por lo que tal vez haya algo inusual 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 -bashNo 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.
Y úselo para deducir la cantidad de proyectiles que necesitará para salir, antes de llegar al intérprete "raíz"
fuente
Puede usar la variable de entorno SHLVL :
fuente
sshpor ejemplo, para la misma cuenta, esto seguirá siendo1encontré eso
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').fuente