28 votes

Terminal - comment redémarrer la session après une sortie par inadvertance ?

Il m'arrive parfois de quitter par inadvertance une session de terminal (généralement parce que je pense être connecté à un système distant, alors que ce n'est pas le cas), ce qui m'amène à ce stade :

enter image description here

Comment puis-je redémarrer la session à ce stade ? Je ne veux pas fermer la fenêtre ou l'onglet parce que j'ai un tas d'onglets configurés pour mon flux de travail normal, donc je veux juste relancer la session dans l'onglet actuel (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 le rouvrir, mais c'est loin d'être idéal car cela interrompt évidemment tout ce que je suis en train de faire dans d'autres fenêtres/onglets de Terminal.

1 votes

Les émulateurs de terminal Linux (KDE/Gnome) vous permettent de réorganiser les onglets. Ainsi, si vous lancez un nouvel onglet, vous pouvez le déplacer pour remplacer celui que vous avez fermé. Le terminal d'OS X ne dispose-t-il pas de cette fonctionnalité ? (J'aime aussi utiliser GNU screen pour multiplexer un grand nombre de sessions shell, plutôt que des onglets dans une fenêtre de terminal. J'ai un autre onglet avec une session screen sur un autre ordinateur. J'ouvre parfois un autre terminal si je veux voir deux choses à la fois, mais normalement j'aime avoir mes shells numérotés, comme le fait screen, plutôt que d'être juste là

1 votes

Quoi qu'il en soit, je suggère screen (ou tmux si vous ne connaissez pas encore screen) pour garder plusieurs shells sur le même hôte dans un seul onglet de l'interface graphique. Cette hiérarchie à deux niveaux d'onglets / fenêtres d'écran permet d'avoir beaucoup de choses ouvertes, sans perdre la trace de ce qui est où. De plus, comme je l'ai dit, le fait d'avoir des numéros pour les différents shells permet de se rappeler facilement à quel numéro il faut passer ( ^t 8 par exemple) pour un contexte donné, au lieu de compter visuellement sur quel onglet cliquer ou (ou combien de ctrl-pgup frapper).

0 votes

Oui, je viens d'essayer et il semble que vous puissiez faire glisser les onglets. Je pense que je préfère garder les onglets d'origine, car ils ont de grands tampons de défilement qui sont préservés lors des lancements/redémarrages, ce qui peut parfois me sauver la vie. J'ai généralement deux fenêtres, l'une pour les sessions distantes et l'autre pour les sessions locales, avec environ trois onglets dans chacune d'elles, et je me fie à la "mémoire musculaire" pour connaître l'utilité de chaque onglet.

33voto

William T Froggard Points 5321

A ce stade, il n'y a aucun moyen de récupérer l'onglet. La session du terminal est fermée et ne dispose plus d'un TTY. Il n'y a tout simplement aucun moyen de référencer l'onglet afin de faire quelque chose d'intelligent. Je vous suggère d'ajouter cette fonction à votre .bashrc ou .profile afin d'éviter ce 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 "?Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

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

0 votes

Merci - c'est une bonne suggestion. Je me demande s'il n'est pas possible d'aller un peu plus loin et d'ajouter un délai d'attente, de sorte que la déconnexion se produise toujours après, disons, 5 secondes, si l'utilisateur ne répond pas....

1 votes

Vous l'avez eu ! Maintenant, après 5 secondes (le -t 5 ), la commande de lecture échoue, ce qui déclenche la commande exit qui la suit.

1 votes

Excellent - merci - j'aimerais pouvoir vous donner deux votes positifs ! ;-)

10voto

Old Pro Points 5634

Le script de William T Froggard n'a pas fait ce dont j'avais besoin, car généralement, la seule façon de me mettre dans cette situation est via ^D ( ctrl + D ), et en redéfinissant exit n'a rien fait pour cette situation. Pour moi, la suggestion de Dennis Williamson de mettre en place IGNOREEOF était suffisante. J'ai juste ajouté :

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

à mon ~/.bashrc 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, l'interpréteur de commandes sort, donc sortir quand je veux est toujours facile, mais maintenant un seul ^D me donnera un avertissement. (Si vous voulez, vous pouvez définir IGNOREEOF à un nombre plus élevé pour exiger des ^D consécutifs supplémentaires).

Également 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 sortir d'un sous-shell et sortir du shell de niveau supérieur.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X