Terminal - comment redémarrer la session après avoir quitté par inadvertance?

22

Parfois, je quitte par inadvertance une session Terminal (généralement parce que je pense que je suis connecté à un système distant, alors que je ne le suis pas), alors j'arrive à ce point:

entrez la description de l'image ici

Comment puis-je redémarrer la session à ce stade? Je ne veux pas fermer la fenêtre ou l'onglet car j'ai un tas d'onglets tous configurés pour mon flux de travail normal, donc je veux juste que la session dans l'onglet actuel recommence (c'est-à-dire revenir à une invite bash).

La seule solution que j'ai trouvée jusqu'à présent est de quitter complètement Terminal et de l'ouvrir à nouveau, mais c'est loin d'être idéal car cela interrompt évidemment tout ce que je fais dans d'autres fenêtres / onglets de Terminal.

Paul R
la source
1
Les émulateurs de terminal Linux (KDE / Gnome) vous permettent de réorganiser les onglets. Donc, si vous démarrez un nouvel onglet, vous pouvez le déplacer pour remplacer celui que vous avez fermé. Le terminal d'OS X n'a-t-il pas cela? (Je ne suis pas un Mac, je viens de le voir dans les "questions de réseau chaudes".) J'aime aussi utiliser l'écran GNU pour multiplexer beaucoup de sessions shell, plutôt que des onglets dans une fenêtre de terminal. J'ai un autre onglet avec une session d'écran sur un autre ordinateur. J'ouvre parfois un autre terminal si je veux voir deux choses à la fois, mais normalement j'aime avoir mes coquilles numérotées, comme le fait l'écran, plutôt que juste là
Peter Cordes
1
Quoi qu'il en soit, je suggérerais screen (ou tmux si vous ne connaissez pas déjà screen) pour garder plusieurs shells sur le même hôte dans un onglet GUI. Cette hiérarchie à deux niveaux d'onglets / fenêtres d'écran permet d'avoir beaucoup de choses ouvertes, sans perdre de vue où. De plus, comme je l'ai dit, avoir des numéros pour les différents shells, il est facile de se rappeler à quel numéro échanger ( ^t 8par exemple) pour un contexte donné, au lieu de compter visuellement sur quel onglet cliquer ou (ou combien de ctrl-pgup frapper) .
Peter Cordes
1
screen et tmux ont tous deux un scrollback configurable à l'intérieur de chaque fenêtre d'écran. Je ne me souviens pas avoir vu quoi que ce soit sur la conservation du défilement sur le disque pour la persistance lors des redémarrages! C'est bien. Trois onglets est assez facile à suivre mentalement. J'ai généralement quelque chose comme 10 sur mon bureau à domicile, car je fais presque tout à partir de la ligne de commande, pas un navigateur de fichiers GUI. (lecture de vidéos / livres audio, etc.) cdCependant, j'ai généralement environ trois shells édités en code source lorsque je travaille sur du code, ce qui correspond à votre utilisation.
Peter Cordes
1
Quoi qu'il en soit, faire glisser les onglets devrait faciliter la récupération après la fermeture accidentelle d'un onglet, car vous pouvez le replacer là où il va.
Peter Cordes
1
Je ne pense pas que beaucoup de gens les utilisent localement, pour des sessions shell locales dans un seul onglet d'émulateur de terminal. IDK, peut-être que d'autres accros de la ligne de commande à l'ancienne le font aussi. Le cas d'utilisation principal est après sshquelque part. Je viens de m'habituer à utiliser l'écran et à l'utiliser localement ainsi que sur des sessions distantes. Si je comprends bien, si vous n'avez pas déjà screendans votre mémoire musculaire, apprenez tmux parce que l'écran est vieux et cruel. Je pourrais probablement basculer vers tmuxet le configurer pour utiliser toutes les mêmes raccourcis clavier que j'utilise screen, mais l'écran fonctionne toujours bien pour moi.
Peter Cordes

Réponses:

26

À ce stade, il n'y a aucun moyen de récupérer l'onglet. La session de terminal est fermée et elle n'a plus de téléscripteur. Il n'y a tout simplement aucun moyen de référencer l'onglet afin de faire quelque chose d'intelligent. Je suggère d'ajouter cette fonction à votre .bashrc ou .profile afin que vous n'ayez plus le problème à l'avenir:

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
}

ou, pour ceux d'entre nous qui utilisent le Z Shell (ajoutez-le à votre .zshrc):

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

C'est une jolie petite barrière entre vous et cette commande de sortie ennuyeuse! Seigneur sait que j'ai fait la même chose plusieurs fois dans le passé.

William T Froggard
la source
1
Tu l'as eu! Maintenant, après 5 secondes (l' -t 5option), la commande de lecture échouera, ce qui déclenchera la commande de sortie qui la suivra.
William T Froggard
1
Excellent - merci - j'aimerais pouvoir vous donner deux votes positifs! ;-)
Paul R
1
@PaulR: Vous n'avez pas besoin d'alias exitsi vous utilisez Bash. Vous pouvez mettre votre script dedans ~/.bash_logout.
pause jusqu'à nouvel ordre.
2
@DennisWilliamson: idée intéressante, mais je ne sais pas comment vous pouvez annuler la déconnexion de l'intérieur .bash_logout?
Paul R
3
@PaulR: Oups. Je n'ai pas pensé à ça! Pour être complet, vous devez également logoutcréer IGNOREEOFun alias et définir une valeur supérieure à 1 (ou relier ^ D).
pause jusqu'à nouvel ordre.
5

Le script de William T Froggard n'a pas fait ce dont j'avais besoin, car en général, la seule façon d'entrer dans cette situation est via ^ D ( ctrl+ D), et la redéfinition exitn'a rien fait pour cette situation. Pour moi, la suggestion de Dennis Williamson de fixer IGNOREEOFétait suffisante. Je viens d'ajouter:

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

dans mon ~/.bashrcfichier et maintenant (si je suis dans le shell de niveau supérieur et que je quitte le terminal), le premier ^ D génère la réponse:

Use "logout" to leave the shell.

Si je tape à nouveau ^ D immédiatement, le shell se ferme, donc sortir quand je veux est toujours facile, mais maintenant un seul ^ D me donnera un avertissement. (Si vous le souhaitez, vous pouvez définir IGNOREEOFun nombre plus élevé pour exiger des ^ D consécutifs supplémentaires.)

Aussi utile, si je suis dans un sous-shell, le premier ^ D génère la réponse:

Use "exit" to leave the shell.

Encore une fois, un ^ D supplémentaire me fera sortir, et maintenant je peux faire la différence entre quitter un sous-shell et quitter le shell de niveau supérieur.

Old Pro
la source