Terminal - Wie starte ich eine Sitzung neu, nachdem ich sie versehentlich beendet habe?

22

Manchmal beende ich versehentlich eine Terminalsitzung (normalerweise, weil ich denke, dass ich mit einem Remote-System verbunden bin, wenn ich es nicht bin), also komme ich zu folgendem Punkt:

Bildbeschreibung hier eingeben

Wie kann ich die Sitzung zu diesem Zeitpunkt neu starten? Ich möchte das Fenster oder die Registerkarte nicht schließen, da für meinen normalen Arbeitsablauf eine Reihe von Registerkarten eingerichtet sind. Daher möchte ich nur die Sitzung in der aktuellen Registerkarte wieder in Gang bringen (dh zu einer Bash-Eingabeaufforderung zurückkehren).

Die einzige Lösung, die ich bisher gefunden habe, besteht darin, Terminal vollständig zu beenden und erneut zu öffnen, aber das ist alles andere als ideal, da es offensichtlich alles andere unterbricht, was ich in anderen Terminalfenstern / -registern tue.

Paul R
quelle
1
Mit den Terminalemulatoren von Linux (KDE / Gnome) können Sie Registerkarten neu anordnen. Wenn Sie also eine neue Registerkarte beginnen, können Sie diese verschieben, um die geschlossene zu ersetzen. Hat das Terminal von OS X das nicht? (Ich bin kein Mac, ich habe dies nur in "Hot Network Questions" gesehen.) Ich verwende GNU-Bildschirm auch gerne, um viele Shell-Sitzungen zu multiplexen, anstatt Registerkarten in einem Terminalfenster. Ich habe eine andere Registerkarte mit einer Bildschirmsitzung auf einem anderen Computer. Ich öffne manchmal ein anderes Terminal, wenn ich zwei Dinge gleichzeitig sehen möchte, aber normalerweise mag ich es, wenn meine Muscheln nummeriert werden, wie es der Bildschirm tut, und nicht nur dort
Peter Cordes
1
Wie auch immer, ich würde screen (oder tmux, wenn Sie screen noch nicht kennen) vorschlagen, um mehrere Shells auf demselben Host in einer GUI-Registerkarte zu belassen. Diese zweistufige Hierarchie von Registerkarten / Bildschirmfenstern ermöglicht es, viele Dinge zu öffnen, ohne den Überblick darüber zu verlieren, was wo ist. Wie ich bereits sagte, können Sie sich anhand der Nummern für die verschiedenen Shells leicht merken, auf welche Nummer Sie ( ^t 8zum Beispiel) für einen bestimmten Kontext tauschen müssen , anstatt visuell zu zählen, auf welchen Tabulator Sie klicken müssen oder (oder wie viele Strg-Pgups Sie treffen möchten). .
Peter Cordes
1
screen und tmux haben jeweils einen konfigurierbaren scrollback in jedem screen-fenster. Ich erinnere mich nicht, dass ich irgendetwas darüber gesehen habe, wie ein Scrollback für die Dauer von Neustarts auf der Festplatte belassen wurde! Das ist ordentlich. Drei Registerkarten sind einfach genug, um geistig den Überblick zu behalten. Normalerweise habe ich 10 auf meinem Heim-Desktop, da ich fast alles über die Befehlszeile erledige, nicht über einen GUI-Dateibrowser. (Abspielen von Videos / Hörbüchern usw.) Ich habe normalerweise ungefähr drei Shells cdfür den Quellcode, wenn ich an Code arbeite, damit dies mit Ihrer Verwendung übereinstimmt.
Peter Cordes
1
Das Ziehen von Registerkarten sollte es auf jeden Fall einfacher machen, versehentlich geschlossene Registerkarten wiederherzustellen, da Sie sie wieder genau dort platzieren können, wo sie hingehören.
Peter Cordes
1
Ich glaube nicht, dass viele Leute sie lokal für lokale Shell-Sitzungen in einem einzelnen Terminal-Emulator-Tab verwenden. IDK, vielleicht machen es auch andere Old-School-Kommandozeilen-Junkies. Der Hauptanwendungsfall ist nach sshirgendwo. Ich habe mich gerade daran gewöhnt, Bildschirm zu verwenden und ihn sowohl lokal als auch in Remote-Sitzungen zu verwenden. So wie ich es verstehe, sollten Sie screentmux lernen , wenn Sie noch kein Muskelgedächtnis haben, weil der Bildschirm alt und schmutzig ist. Ich könnte wahrscheinlich darauf tmuxumsteigen und es so konfigurieren, dass es dieselben Tastenkombinationen verwendet, für die ich sie verwende screen, aber der Bildschirm funktioniert für mich immer noch einwandfrei .
Peter Cordes

Antworten:

26

Zu diesem Zeitpunkt gibt es keine Möglichkeit, den Tab zurückzugewinnen. Die Terminalsitzung ist geschlossen und hat kein TTY mehr. Es gibt einfach keine Möglichkeit, auf die Registerkarte zu verweisen, um etwas Cleveres zu tun. Ich würde vorschlagen, diese Funktion zu Ihrem .bashrc oder .profile hinzuzufügen, damit Sie das Problem in Zukunft nicht mehr haben:

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
}

oder für diejenigen von uns, die die Z-Shell verwenden (fügen Sie sie Ihrer .zshrc hinzu):

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

Es ist eine nette kleine Barriere zwischen Ihnen und diesem nervigen Ausstiegsbefehl! Gott weiß, dass ich in der Vergangenheit oft dasselbe getan habe.

William T Froggard
quelle
1
Du hast es! Jetzt, nach 5 Sekunden (die -t 5Option), schlägt der Lesebefehl fehl, was den darauf folgenden Exit-Befehl auslöst.
William T Froggard
1
Hervorragend - danke - ich wünschte, ich könnte Ihnen zwei Up-Votes geben! ;-)
Paul R
1
@PaulR: Sie müssen kein Alias ​​verwenden, exitwenn Sie Bash verwenden. Sie können Ihr Skript einfügen ~/.bash_logout.
Bis auf weiteres angehalten.
2
@DennisWilliamson: Interessante Idee, aber ich bin mir nicht sicher, wie Sie die Abmeldung von innen stornieren würden .bash_logout?
Paul R
3
@PaulR: Ups. Das habe ich nicht bedacht! Der Vollständigkeit halber sollten Sie auch einen Alias logoutund einen IGNOREEOFWert größer als 1 festlegen (oder ^ D erneut binden).
Bis auf weiteres angehalten.
5

Das Skript von William T. Froggard hat nicht das getan, was ich brauchte, weil ich in der Regel nur über ^ D ( ctrl+ D) in diese Situation komme und die Neudefinition exitnichts für diese Situation getan hat. Dennis Williamsons Einstellungsvorschlag hat mir IGNOREEOFgereicht. Ich habe gerade hinzugefügt:

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

zu meiner ~/.bashrcDatei und jetzt (wenn ich in der obersten Ebene Shell bin und das Terminal verlassen würde) erzeugt das erste ^ D die Antwort:

Use "logout" to leave the shell.

Wenn ich ^ D sofort erneut eingebe, wird die Shell beendet. Es ist also immer noch einfach, sie zu beenden, wenn ich möchte. Jetzt gibt ein einzelnes ^ D eine Warnung aus. (Wenn Sie möchten, können Sie IGNOREEOFeine höhere Zahl festlegen , um weitere aufeinanderfolgende ^ D zu erfordern.)

Auch hilfreich, wenn ich in einer Sub-Shell bin, generiert das erste ^ D die Antwort:

Use "exit" to leave the shell.

Wieder holt mich ein extra ^ D raus und jetzt kann ich den Unterschied zwischen dem Beenden einer Sub-Shell und dem Beenden der Top-Level-Shell erkennen.

Alter Pro
quelle