Si abro una terminal como xterm
tendré un shell. Entonces si lo uso ssh
o zsh
tendré otro "nivel" de shell. ¿Hay alguna manera de saber cuántas veces tengo que Ctrl+D
escribir o escribir exit
para 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-name
es 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-headers
portabilidad agregando=
después del nombre de la columna. Además, lacomm
columna no es POSIX, pero sí lacmd
columna (que incluye los argumentos del comando). También-p
es necesario antes del PID en la sintaxis POSIX. Porps -o cmd= -p $PPID
lo tanto, es portátil y proporciona información similar.comm
columna está especificada por POSIX y documentada en Mac OS X, mientras que lacmd
columna existe en Linux pero no es estándar.De hecho, has encontrado el término correcto¹. Hay una variable de entorno
SHLVL
que todos los shells interactivos principales (bash, tcsh, zsh) se incrementan en 1 cuando comienzan. Entonces, si comienzas un shell dentro de un shell,SHLVL
aumenta en 1Sin embargo, esto no responde directamente a su preocupación, ya que
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 indicador, pero solo si el proceso padre del shell es otro shell (con heurística como "si su nombre termina ensh
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. 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$PPID
producir resultados distintos. Puede restablecer manualmenteSHLVL
a 1 en estos shells, o establecer el suyo propioTERMSHLVL
en 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 $PPID
da (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
ssh
por ejemplo, para la misma cuenta, esto seguirá siendo1
encontré 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
nohup
trabajo en ejecución o similar.(Además, yo uso
alias grep='grep --color=auto'
).fuente