Terminal: ¿cómo reiniciar la sesión después de salir inadvertidamente?

22

A veces salgo inadvertidamente de una sesión de Terminal (generalmente porque creo que estoy conectado a un sistema remoto, cuando no lo estoy), así que llego a este punto:

ingrese la descripción de la imagen aquí

¿Cómo puedo reiniciar la sesión en este momento? No quiero cerrar la ventana o pestaña porque tengo un montón de pestañas configuradas para mi flujo de trabajo normal, por lo que solo quiero que la sesión en la pestaña actual vuelva a funcionar (es decir, volver a un indicador de bash).

La única solución que he encontrado hasta ahora es salir de Terminal por completo y abrirlo nuevamente, pero eso está lejos de ser ideal, ya que obviamente interrumpe cualquier otra cosa que esté haciendo en otras ventanas / pestañas de Terminal.

Paul R
fuente
1
Los emuladores de terminal de Linux (KDE / Gnome) le permiten reordenar pestañas. Entonces, si comienza una nueva pestaña, puede moverla para reemplazar la que cerró. ¿No tiene eso el terminal de OS X? (No soy una persona mac, acabo de ver esto en "preguntas de la red"). También me gusta usar la pantalla GNU para multiplexar muchas sesiones de shell, en lugar de pestañas en una ventana de terminal. Tengo otra pestaña con una sesión de pantalla en otra computadora. A veces abro otra terminal si quiero ver dos cosas a la vez, pero normalmente me gusta que me numeren mis conchas, como lo hace la pantalla, en lugar de solo allí
Peter Cordes
1
De todos modos, sugeriría screen (o tmux si aún no conoce la pantalla) para mantener múltiples shells en el mismo host en una pestaña GUI. Esta jerarquía de dos niveles de pestañas / ventanas de pantalla permite tener muchas cosas abiertas, sin perder la noción de qué es dónde. Además, como dije, tener números para los diferentes shells hace que sea fácil recordar a qué número cambiar ( ^t 8por ejemplo) para un contexto dado, en lugar de contar visualmente en qué pestaña hacer clic o (o cuántos ctrl-pgup presionar) .
Peter Cordes
1
screen y tmux tienen un scrollback configurable dentro de cada ventana de pantalla. Sin embargo, no recuerdo haber visto nada acerca de mantener el desplazamiento hacia atrás en el disco para la persistencia entre reinicios. Está muy bien. Tres pestañas son lo suficientemente fáciles de seguir mentalmente. Por lo general, tengo algo así como 10 en el escritorio de mi casa, ya que hago casi todo desde la línea de comandos, no un navegador de archivos GUI. (reproducción de videos / audiolibros, etc.) Por lo general, tengo alrededor de tres shells cdeditados al código fuente cuando estoy trabajando en el código, de modo que coincida con su uso.
Peter Cordes
1
De todos modos, arrastrar las pestañas debería facilitar la recuperación al cerrar accidentalmente una pestaña, ya que puede volver a colocarla donde va.
Peter Cordes
1
No creo que mucha gente los use localmente, para sesiones de shell locales dentro de una sola pestaña del emulador de terminal. IDK, tal vez otros adictos a la línea de comandos de la vieja escuela también lo hagan. El principal caso de uso es después de sshing. Me acabo de acostumbrar a usar la pantalla, y la uso localmente así como en sesiones remotas. Según tengo entendido, si aún no tienes screenmemoria muscular, aprende tmux porque la pantalla es vieja y crujiente. Probablemente podría cambiar tmuxy configurarlo para usar las mismas combinaciones de teclas que utilizo screen, pero la pantalla todavía funciona bien para mí.
Peter Cordes

Respuestas:

26

En este punto, no hay forma de recuperar la pestaña. La sesión de terminal está cerrada y ya no tiene un TTY. Simplemente no hay forma de hacer referencia a la pestaña para hacer algo inteligente. Sugeriría agregar esta función a su .bashrc o .profile para que no tenga el problema en el futuro:

exit() {
    read -t5 -n1 -p "Do you really wish to exit? [yN] " should_exit || should_exit=y
    case $should_exit in
        [Yy] ) builtin exit $1 ;;
        * ) printf "\n" ;;
    esac
}

o, para aquellos de nosotros que usamos Z Shell (agrégalo a tu .zshrc)

exit() {
    if read -t5 -q should_exit\?"Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

¡Es una pequeña barrera entre tú y ese molesto comando de salida! Dios sabe que he hecho lo mismo muchas veces en el pasado.

William T Froggard
fuente
1
¡Lo tienes! Ahora, después de 5 segundos (la -t 5opción), el comando de lectura fallará, lo que activa el comando de salida que lo sigue.
William T Froggard
1
Excelente, gracias. ¡Ojalá pudiera darle dos votos positivos! ;-)
Paul R
1
@PaulR: No necesitas un alias exitsi estás usando Bash. Puedes poner tu guión ~/.bash_logout.
Pausado hasta nuevo aviso.
2
@DennisWilliamson: idea interesante, pero no estoy seguro de cómo cancelar el cierre de sesión desde dentro .bash_logout.
Paul R
3
@PaulR: ¡Vaya! ¡Fallé en considerar eso! Para completar, también debe alias logouty establecer IGNOREEOFmayor que 1 (o volver a vincular ^ D).
Pausado hasta nuevo aviso.
5

El guión de William T Froggard no hizo lo que necesitaba, porque generalmente la única forma en que me meto en esta situación es a través de ^ D ( ctrl+ D), y la redefinición exitno hizo nada para esa situación. Para mí, la sugerencia de configuración de Dennis Williamson IGNOREEOFfue suficiente. Acabo de agregar:

# Do not exit on a single ^D, require 2 in a row
IGNOREEOF=1

a mi ~/.bashrcarchivo y ahora (si estoy en el shell de nivel superior y saldría del terminal) el primer ^ D genera la respuesta:

Use "logout" to leave the shell.

Si escribo ^ D de nuevo de inmediato, el shell se cierra, por lo que salir cuando quiero todavía es fácil, pero ahora un solo ^ D me dará una advertencia. (Si lo desea, puede establecer IGNOREEOFun número más alto para requerir ^ D's consecutivos adicionales).

También es útil, si estoy en un sub-shell, el primer ^ D genera la respuesta:

Use "exit" to leave the shell.

Una vez más, un ^ D adicional me sacará, y ahora puedo notar la diferencia entre salir de un shell secundario y salir del shell de nivel superior.

Viejo pro
fuente