Terminale: come riavviare la sessione dopo essere usciti inavvertitamente?


22

A volte esco inavvertitamente da una sessione di Terminale (di solito perché penso di essere connesso a un sistema remoto, quando non lo sono), quindi arrivo a questo punto:

inserisci qui la descrizione dell'immagine

Come posso riavviare la sessione a questo punto? Non voglio chiudere la finestra o la scheda perché ho un sacco di schede tutte configurate per il mio normale flusso di lavoro, quindi voglio solo riavviare la sessione nella scheda corrente (ovvero tornare a un prompt di bash).

L'unica soluzione che ho trovato finora è quella di chiudere completamente Terminal e riaprirlo, ma è tutt'altro che ideale in quanto interrompe ovviamente qualsiasi altra cosa che sto facendo in altre finestre / schede di Terminal.


1
Gli emulatori di terminale Linux (KDE / Gnome) ti consentono di riordinare le schede. Pertanto, se si avvia una nuova scheda, è possibile spostarla per sostituire quella chiusa. Il terminale di OS X non lo possiede? (Non sono una persona mac, l'ho appena visto in "domande sulla rete calda".) Mi piace anche usare lo schermo GNU per multiplexare molte sessioni della shell, piuttosto che le schede in una finestra del terminale. Ho un'altra scheda con una sessione schermo su un altro computer. A volte apro un altro terminale se voglio vedere due cose contemporaneamente, ma normalmente mi piace avere le mie conchiglie numerate, come fa lo schermo, piuttosto che lì
Peter Cordes,

1
Ad ogni modo, suggerirei screen (o tmux se non si conosce già screen) per mantenere più shell sullo stesso host in una scheda della GUI. Questa gerarchia a due livelli di schede / finestre dello schermo consente di aprire molte cose, senza perdere traccia di dove. Inoltre, come ho detto, avere numeri per le diverse shell rende facile ricordare a quale numero scambiare ( ^t 8ad esempio) per un dato contesto, invece di contare visivamente quale scheda fare clic o (o quanti ctrl-pgup colpire) .
Peter Cordes,

1
screen e tmux hanno entrambi uno scrollback configurabile all'interno di ciascuna finestra dello schermo. Non ricordo di aver visto nulla sul mantenimento dello scrollback sul disco per la persistenza tra i riavvii, però! È pulito. Tre schede sono abbastanza facili da tenere traccia di mentalmente. Di solito ho qualcosa come 10 sul desktop di casa, dal momento che faccio quasi tutto dalla riga di comando, non un browser di file GUI. (riproduzione di video / audiolibri, ecc.) Di solito ho circa tre shell modificate cdsul codice sorgente quando sto lavorando sul codice, in modo che corrisponda al tuo utilizzo.
Peter Cordes,

1
In ogni caso, trascinare le schede in giro dovrebbe facilitare il recupero dalla chiusura accidentale di una scheda, poiché puoi rimetterla dove va.
Peter Cordes,

1
Non credo che molte persone li usino localmente, per sessioni shell locali all'interno di una singola scheda dell'emulatore di terminale. IDK, forse lo fanno anche altri drogati della vecchia riga di comando. Il caso d'uso principale è dopo aver ssheseguito da qualche parte. Mi sono appena abituato a usare lo schermo e ad usarlo localmente e su sessioni remote. A quanto ho capito, se non hai già screennella memoria muscolare, impara tmux perché lo schermo è vecchio e croccante. Probabilmente potrei passare a tmuxe configurarlo per usare tutte le stesse combinazioni di tasti che uso per screen, ma lo schermo funziona ancora bene per me.
Peter Cordes,

Risposte:


26

A questo punto, non c'è modo di riavere la scheda. La sessione del terminale è chiusa e non ha più un TTY. Non c'è modo di fare riferimento alla scheda per fare qualcosa di intelligente. Suggerirei di aggiungere questa funzione al tuo .bashrc o .profile in modo da non avere il problema in 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, per quelli di noi che usano Z Shell (aggiungilo al tuo .zshrc):

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

È una bella barriera tra te e quel fastidioso comando di uscita! Lord sa che ho fatto la stessa cosa molte volte in passato.


1
Avete capito bene! Ora, dopo 5 secondi (l' -t 5opzione), il comando di lettura fallirà, il che innesca il comando di uscita che lo segue.
William T Froggard,

1
Eccellente - grazie - Vorrei poterti dare due voti positivi! ;-)
Paul R

1
@PaulR: non devi alias exitse stai usando Bash. Puoi inserire la tua sceneggiatura ~/.bash_logout.
In pausa fino a nuovo avviso.

2
@DennisWilliamson: idea interessante, ma non sono sicuro di come annulleresti il ​​logout dall'interno .bash_logout?
Paul R

3
@PaulR: Oops. Non ci sono riuscito! Per completezza, dovresti anche logoutimpostare l' alias e impostare un valore IGNOREEOFmaggiore di 1 (o ricollegare ^ D).
In pausa fino a nuovo avviso.

5

La sceneggiatura di William T Froggard non ha fatto ciò di cui avevo bisogno, perché generalmente l'unico modo per entrare in questa situazione è via ^ D ( ctrl+ D) e la ridefinizione exitnon ha fatto nulla per quella situazione. Per me, il suggerimento di Dennis Williamson di ambientare IGNOREEOFera abbastanza. Ho appena aggiunto:

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

al mio ~/.bashrcfile e ora (se sono nella shell di livello superiore e dovessi uscire dal terminale) il primo ^ D genera la risposta:

Use "logout" to leave the shell.

Se digito nuovamente ^ D immediatamente, la shell esce, quindi uscire quando voglio è ancora facile, ma ora un singolo ^ D mi darà un avvertimento. (Se lo si desidera, è possibile impostare IGNOREEOFun numero più alto per richiedere ulteriori ^ D consecutivi.)

Utile anche, se mi trovo in una sotto-shell, la prima ^ D genera la risposta:

Use "exit" to leave the shell.

Ancora una volta, un ^ D in più mi farà uscire, e ora posso dire la differenza tra uscire da una shell secondaria ed uscire dalla shell di livello superiore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.