Terminal - bagaimana cara memulai kembali sesi setelah keluar secara tidak sengaja?

22

Kadang-kadang saya secara tidak sengaja keluar dari sesi Terminal (biasanya karena saya pikir saya terhubung ke sistem jarak jauh, ketika saya tidak), jadi saya sampai ke titik ini:

masukkan deskripsi gambar di sini

Bagaimana saya bisa memulai kembali sesi pada saat ini? Saya tidak ingin menutup jendela atau tab karena saya memiliki banyak tab yang disiapkan untuk alur kerja normal saya, jadi saya hanya ingin sesi di tab saat ini berjalan lagi (yaitu kembali ke bash prompt).

Satu-satunya solusi yang saya temukan sejauh ini adalah keluar dari Terminal sepenuhnya dan membukanya lagi, tetapi itu jauh dari ideal karena jelas mengganggu apa pun yang saya lakukan di jendela / tab Terminal lainnya.

Paul R
sumber
1
Emulator terminal Linux (KDE / Gnome) memungkinkan Anda memesan ulang tab. Jadi, jika Anda memulai tab baru, Anda bisa memindahkannya untuk menggantikan yang Anda tutup. Bukankah terminal OS X memilikinya? (Saya bukan orang mac, saya hanya melihat ini di "pertanyaan jaringan panas".) Saya juga suka menggunakan layar GNU untuk multiplex banyak sesi shell, daripada tab di jendela terminal. Saya memiliki tab lain dengan sesi layar di komputer lain. Saya kadang-kadang membuka terminal lain jika saya ingin melihat dua hal sekaligus, tetapi biasanya saya suka nomor kerang saya, cara layarnya, daripada hanya di sana
Peter Cordes
1
Bagaimanapun, saya akan menyarankan layar (atau tmux jika Anda belum tahu layar) untuk menjaga beberapa shell pada host yang sama dalam satu tab GUI. Hirarki dua tingkat tab / layar-jendela ini memungkinkan banyak hal terbuka, tanpa kehilangan jejak di mana. Juga, seperti yang saya katakan, memiliki nomor untuk cangkang yang berbeda membuatnya mudah untuk mengingat nomor yang akan ditukar ( ^t 8misalnya) untuk konteks tertentu, alih-alih menghitung secara visual tab mana yang akan diklik atau (atau berapa banyak ctrl-pgup yang dipukul) .
Peter Cordes
1
layar dan tmux keduanya memiliki scrollback yang dapat dikonfigurasi di dalam setiap layar-jendela. Saya tidak ingat melihat sesuatu tentang menjaga scrollback pada disk untuk kegigihan di seluruh reboot, meskipun! Itu rapi. Tiga tab cukup mudah untuk melacak mental. Saya biasanya memiliki sesuatu seperti 10 di desktop rumah saya, karena saya melakukan hampir semuanya dari baris perintah, bukan browser file GUI. (memutar video / buku audio, dll.) Saya biasanya memiliki sekitar tiga shell yang cddiedit ke kode sumber ketika saya sedang mengerjakan kode, sehingga cocok dengan penggunaan Anda.
Peter Cordes
1
Bagaimanapun, menyeret tab di sekitar harus membuatnya mudah untuk pulih dari penutupan tab secara tidak sengaja, karena Anda dapat meletakkannya kembali ke tempatnya.
Peter Cordes
1
Saya tidak berpikir banyak orang menggunakannya secara lokal, untuk sesi shell lokal di dalam satu tab emulator terminal. IDK, mungkin pecandu baris perintah sekolah tua lain juga melakukannya. Kasus penggunaan utama adalah setelah masuk ke sshsuatu tempat. Saya baru saja terbiasa menggunakan layar, dan menggunakannya secara lokal maupun pada sesi jarak jauh. Seperti yang saya pahami, jika Anda belum memiliki screenmemori otot, pelajari tmux karena layarnya sudah tua dan kasar. Saya mungkin bisa beralih ke tmuxdan mengkonfigurasi untuk menggunakan semua keybinds yang sama seperti yang saya gunakan screen, tetapi layar masih berfungsi dengan baik untuk saya.
Peter Cordes

Jawaban:

26

Pada titik ini, tidak ada cara untuk mendapatkan kembali tab. Sesi terminal ditutup, dan tidak lagi memiliki TTY. Tidak ada cara untuk referensi tab untuk melakukan sesuatu yang pintar. Saya sarankan menambahkan fungsi ini ke .bashrc atau .profile Anda sehingga Anda tidak akan memiliki masalah di masa depan:

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
}

atau, bagi kita yang menggunakan Z Shell (tambahkan ke .zshrc Anda):

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

Ini adalah penghalang kecil yang bagus antara Anda dan perintah keluar yang menjengkelkan! Tuhan tahu saya telah melakukan hal yang sama berkali-kali di masa lalu.

William T Froggard
sumber
1
Kamu mendapatkannya! Sekarang, setelah 5 detik ( -t 5opsi), perintah baca akan gagal, yang memicu perintah keluar mengikutinya.
William T Froggard
1
Luar biasa - terima kasih - Saya harap saya bisa memberi Anda dua suara! ;-)
Paul R
1
@ PaulR: Anda tidak perlu alias exitjika Anda menggunakan Bash. Anda dapat memasukkan skrip Anda ~/.bash_logout.
Dijeda sampai pemberitahuan lebih lanjut.
2
@ DennisWilliamson: ide yang menarik, tapi saya tidak yakin bagaimana Anda akan membatalkan logout dari dalam .bash_logout?
Paul R
3
@ PaulR: Ups. Saya gagal mempertimbangkan itu! Untuk kelengkapan, Anda juga harus alias logoutdan menetapkan IGNOREEOFlebih dari 1 (atau rebind ^ D).
Dijeda sampai pemberitahuan lebih lanjut.
5

Skrip William T Froggard tidak melakukan apa yang saya butuhkan, karena umumnya satu-satunya cara saya masuk ke situasi ini adalah melalui ^ D ( ctrl+ D), dan mendefinisikan ulang exittidak melakukan apa pun untuk situasi itu. Bagi saya, saran pengaturan Dennis Williamson IGNOREEOFsudah cukup. Saya baru saja menambahkan:

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

ke ~/.bashrcfile saya dan sekarang (jika saya di shell tingkat atas dan akan keluar dari terminal) ^ D pertama menghasilkan respons:

Use "logout" to leave the shell.

Jika saya mengetik ^ D lagi dengan segera, shell keluar, jadi keluar ketika saya inginkan masih mudah, tapi sekarang satu ^ D akan memberi saya peringatan. (Jika mau, Anda dapat mengatur IGNOREEOFke nomor yang lebih tinggi untuk meminta ^ ^ berturut-turut tambahan.)

Juga membantu, jika saya berada di sub-shell, ^ D pertama menghasilkan respons:

Use "exit" to leave the shell.

Sekali lagi, ^ D tambahan akan mengeluarkan saya, dan sekarang saya dapat membedakan antara keluar dari sub-shell dan keluar dari shell tingkat atas.

Pro tua
sumber