Bagaimana sesi terminal OS X bertahan melalui reboot?

14

Menjadi pengguna Linux yang rajin sebelum membeli MacBook Pro, saya biasanya memiliki beberapa tab terminal terbuka pada satu waktu.

Di masa lalu, crash dan reboot umumnya akan merusak alur kerja saya, dan sebagian besar sejarah tab saya masing-masing. Saya mencari cara untuk mengatasi masalah ini tetapi selalu kosong; selain dari berbagai teknik yang kombinasi digunakan alat seperti ssh, screen, tmux, dan diperlukan server virtual private (atau serupa).

Salah satu hal favorit saya tentang menggunakan MacBook Pro untuk menulis skrip, dan menggunakan alat CLI, dll; adalah bahwa sesi terminal saya bertahan di luar crash dan reboot secara default. Bahkan, saya baru saja memulihkan cadangan dari hampir 2 tahun yang lalu, dan ketika saya masuk untuk pertama kalinya, saya disajikan dengan desktop lama saya dan tiga bashcangkang yang terdiri dari proyek yang saya kerjakan sepanjang waktu yang lalu.

Saya ingin tahu bagaimana OS X memungkinkan fitur ini. Apakah ada orang di sini yang memiliki wawasan tentang cara kerjanya?

suara
sumber

Jawaban:

10

Kode untuk memulihkan Terminal (sebenarnya bashsesi) adalah bagian /etc/bashrc_Apple_Terminalyang bersumber dari /etc/profiledan /etc/bashrcuntuk setiap bashsesi yang berjalan di Terminal.

# Resume Support: Save/Restore Shell State
#
# Terminal assigns each terminal session a unique identifier and
# communicates it via the TERM_SESSION_ID environment variable so that
# programs running in a terminal can save/restore application-specific
# state when quitting and restarting Terminal with Resume enabled.
#
# The following code defines a shell save/restore mechanism. Users can
# add custom state by defining a shell_session_save_user_state function
# that writes restoration commands to the session file at exit. e.g.,
# to save a variable:
#
#   shell_session_save_user_state() { echo MY_VAR="'$MY_VAR'" >> "$SHELL_SESSION_FILE"; }
#
# During shell startup the session file is executed. Old files are
# periodically deleted.
#
# The default behavior arranges to save and restore the bash command
# history independently for each restored terminal session. It also
# merges commands into the global history for new sessions. Because
# of this it is recommended that you set HISTSIZE and HISTFILESIZE to
# larger values.
#
# You may disable this behavior and share a single history by setting
# SHELL_SESSION_HISTORY to 0. There are some common user customizations
# that arrange to share new commands among running shells by
# manipulating the history at each prompt, and they typically include
# 'shopt -s histappend'; therefore, if the histappend shell option is
# enabled, per-session history is disabled by default. You may
# explicitly enable it by setting SHELL_SESSION_HISTORY to 1.
#
# The implementation of per-session command histories in combination
# with a shared global command history is incompatible with the
# HISTTIMEFORMAT variable--the timestamps are applied inconsistently
# to different parts of the history; therefore, if HISTTIMEFORMAT is
# defined, per-session history is disabled by default.
#
# Note that this uses PROMPT_COMMAND to enable per-session history
# the first time for each new session. If you customize PROMPT_COMMAND
# be sure to include the previous value. e.g.,
#
#   PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }your_code_here"
#
# Otherwise, the per-session history won't take effect until the first
# restore.
#
# The save/restore mechanism is disabled if the following file exists:
#
#   ~/.bash_sessions_disable
nohillside
sumber
1
Keren, jadi dari mana komentar ini /etc/bashrc_Apple_Terminal? Saya terutama menyukai itu. # The default behavior arranges to save and restore the bash command history independently for each restored terminal session. It also # merges commands into the global history for new sessions.Itu adalah hal lain yang saya coba terapkan sebelumnya, tetapi tidak berhasil.
Suara
Jadi, saya ingin menandai ini sebagai jawabannya, tetapi saya telah membaca file ini dan .. dapatkah Anda menunjukkan baris kode tertentu yang menyebabkan efek ini? Tampaknya ada lebih dari sekadar fungsi yang disebutkan dalam komentar. Bisa saja itu mata lelah saya, tetapi saya tidak bisa memahaminya.
Suara
@ tjt263 Belum pernah menemukan waktu untuk mengetahuinya
nohillside
@ tjt263 Semuanya dari komentar sampai akhir file, sebenarnya. Pada dasarnya ini digunakan trapuntuk menangkap akhir sesi dan menyimpan sejarahnya di file spesifik tab / sesi.
nohillside
7

Sejauh yang saya tahu, itu hanya menyimpan teks di buffer scrollback setiap jendela. Itu sebenarnya tidak menyelamatkan keadaan dari apa yang sedang berjalan di terminal; itu baru memulai shell baru setelah reboot.

Sebagai percobaan, tentukan variabel dalam shell Anda, dan periksa nilainya:

foo=bar
echo $foo

Kemudian reboot, dan periksa kembali nilai variabel. Anda akan melihat bahwa itu tidak lagi ditentukan.

Wyzard
sumber
Wah! Kalau tidak, itu akan menyeramkan.
uhoh