Terminal - jak zrestartować sesję po nieumyślnym wyjściu?

22

Czasami nieumyślnie wychodzę z sesji terminala (zwykle dlatego, że myślę, że jestem podłączony do systemu zdalnego, kiedy nie jestem), więc przechodzę do tego punktu:

wprowadź opis zdjęcia tutaj

Jak mogę ponownie uruchomić sesję w tym momencie? Nie chcę zamykać okna ani karty, ponieważ mam kilka kart skonfigurowanych do normalnego przepływu pracy, więc chcę po prostu przywrócić sesję do bieżącej karty (tj. Wrócić do monitu bash).

Jedynym rozwiązaniem, które do tej pory znalazłem, jest całkowite zamknięcie Terminala i ponowne otwarcie go, ale jest to dalekie od ideału, ponieważ oczywiście zakłóca wszystko, co robię w innych oknach / kartach Terminalu.

Paul R.
źródło
1
Emulatory terminali w systemie Linux (KDE / Gnome) umożliwiają zmianę kolejności kart. Jeśli więc uruchomisz nową kartę, możesz ją przenieść, aby zastąpić zamkniętą. Czy terminal OS X tego nie ma? (Nie jestem komputerem Mac, właśnie widziałem to w „gorących pytaniach sieciowych”.) Lubię też używać ekranu GNU do multipleksowania wielu sesji powłoki, zamiast kart w oknie terminala. Mam inną kartę z sesją ekranową na innym komputerze. Czasami otwieram inny terminal, jeśli chcę zobaczyć dwie rzeczy na raz, ale zwykle wolę numerować muszle, tak jak robi to ekran, niż tylko tam
Peter Cordes,
1
W każdym razie sugerowałbym screen (lub tmux, jeśli jeszcze nie znasz screena) do przechowywania wielu powłok na tym samym hoście na jednej karcie GUI. Ta dwupoziomowa hierarchia kart / okien-okien pozwala mieć wiele otwartych rzeczy, bez utraty miejsca. Ponadto, jak powiedziałem, posiadanie liczb dla różnych powłok ułatwia zapamiętanie, na którą liczbę zamieniać ( ^t 8na przykład) dla danego kontekstu, zamiast wizualnego liczenia, którą kartę kliknąć lub (lub ile ctrl-pgup trafić) .
Peter Cordes,
1
Zarówno screen, jak i tmux mają konfigurowalne przewijanie w każdym oknie-oknie. Jednak nie pamiętam, żeby widziałem coś o utrzymywaniu przewijania na dysku, aby zachować trwałość podczas ponownego uruchamiania! To miłe. Trzy zakładki są wystarczająco łatwe do śledzenia mentalnego. Zwykle mam na pulpicie domowym coś w rodzaju 10, ponieważ robię prawie wszystko z wiersza poleceń, a nie z przeglądarki plików GUI. (odtwarzanie filmów / audiobooków itp.) Zwykle mam około trzech powłok cdedytowanych do kodu źródłowego, kiedy pracuję nad kodem, więc to pasuje do twojego użycia.
Peter Cordes,
1
W każdym razie przeciąganie kart powinno ułatwić odzyskanie po przypadkowym zamknięciu karty, ponieważ można ją umieścić z powrotem tam, gdzie jest.
Peter Cordes,
1
Nie sądzę, aby wiele osób używało ich lokalnie, do lokalnych sesji powłoki w obrębie jednej karty emulatora terminala. IDK, może robią to także inni ćpunowie ze starej linii poleceń. Głównym przypadkiem użycia jest sshgdzieś indziej. Właśnie przyzwyczaiłem się do korzystania z ekranu i używania go lokalnie, a także na sesjach zdalnych. Jak rozumiem, jeśli jeszcze nie masz screenw pamięci mięśni, naucz się tmux, ponieważ ekran jest stary i kruchy. Prawdopodobnie mógłbym się przełączyć tmuxi skonfigurować, aby używać tych samych skrótów klawiszowych, których używam screen, ale ekran nadal działa dla mnie dobrze.
Peter Cordes,

Odpowiedzi:

26

W tym momencie nie ma możliwości odzyskania karty. Sesja terminalu jest zamknięta i nie ma już TTY. Po prostu nie ma sposobu, aby odwołać się do zakładki, aby zrobić coś sprytnego. Sugeruję dodanie tej funkcji do twojego .bashrc lub .profile, abyś nie miał problemu w przyszłości:

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
}

lub, dla tych z nas, którzy używają powłoki Z (dodaj ją do swojego .zshrc):

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

To miła bariera między tobą a tą irytującą komendą wyjścia! Pan wie, że robiłem to samo wiele razy w przeszłości.

William T Froggard
źródło
1
Masz to! Teraz po 5 sekundach ( -t 5opcja) polecenie odczytu zakończy się niepowodzeniem, co spowoduje uruchomienie polecenia wyjścia po nim.
William T Froggard,
1
Doskonale - dziękuję - chciałbym dać ci dwa głosy w górę! ;-)
Paul R
1
@PaulR: Nie potrzebujesz aliasu, exitjeśli używasz Bash. Możesz umieścić swój skrypt ~/.bash_logout.
Wstrzymano do odwołania.
2
@DennisWilliamson: ciekawy pomysł, ale nie jestem pewien, jak anulowałbyś wylogowanie od wewnątrz .bash_logout?
Paul R
3
@PaulR: Ups. Nie wziąłem tego pod uwagę! Dla kompletności powinieneś także alias logouti ustawić wartość IGNOREEOFwiększą niż 1 (lub ponownie powiązać ^ D).
Wstrzymano do odwołania.
5

Skrypt Williama T Froggarda nie zrobił tego, czego potrzebowałem, ponieważ ogólnie jedynym sposobem, w jaki dostaję się do tej sytuacji, jest ^ D ( ctrl+ D), a przedefiniowanie exitniczego nie zrobiło w tej sytuacji. Dla mnie propozycja Dennisa Williamsona IGNOREEOFbyła wystarczająca. Właśnie dodałem:

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

do mojego ~/.bashrcpliku i teraz (jeśli jestem w powłoce najwyższego poziomu i wychodzę z terminala) pierwsza ^ D generuje odpowiedź:

Use "logout" to leave the shell.

Jeśli natychmiast wypiszę ^ D, powłoka zostanie zamknięta, więc wyjście z niego, kiedy chcę, jest wciąż łatwe, ale teraz pojedyncze ^ D ostrzeże mnie. (Jeśli chcesz, możesz ustawić IGNOREEOFwyższą liczbę, aby wymagać dodatkowych kolejnych ^ D).

Również pomocne, jeśli jestem w podpowłoce, pierwsza ^ D generuje odpowiedź:

Use "exit" to leave the shell.

Ponownie wydostanie mnie dodatkowe ^ D, a teraz mogę odróżnić wyjście z podpowłoki od wyjścia z powłoki najwyższego poziomu.

Old Pro
źródło