Як зберігаються термінальні сесії OS X через перезавантаження?


14

Будучи завзятим користувачем Linux перед покупкою MacBook Pro, я, як правило, відкриваю декілька вкладок терміналів у будь-який час.

У минулому збої та перезавантаження, як правило, втратили мій робочий процес і більшість моїх відповідних історій вкладок. Я шукав шляхи вирішення цієї проблеми, але завжди з’являвся порожнім; в стороні від різних методів , які використані комбінації інструментів , таких як ssh, screen, tmux, і потрібно віртуальний приватний сервер (або аналогічний).

Одна з моїх улюблених речей щодо використання мого MacBook Pro для написання сценаріїв та використання інструментів CLI тощо; полягає в тому, що мої термінальні сеанси зберігаються після збоїв і перезавантаження за замовчуванням. Насправді я просто відновив резервну копію майже 2 роки тому, і коли я вперше ввійшов у систему, мені подарували свій старий робочий стіл та три bashоболонки, які складали проект, над яким я працював весь той час тому.

Мені хотілося б знати, як ОС X робить цю функцію можливою. Хтось тут має уявлення про те, як це працює?

Відповіді:


10

Код для відновлення терміналу (власне bashсеансів) є частиною /etc/bashrc_Apple_Terminalякого отримується через /etc/profileі /etc/bashrcдля кожного bashсеансу, що працює в терміналі.

# 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

1
Круто, так це коментарі від /etc/bashrc_Apple_Terminal? Мені особливо подобається, що # 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.це щось інше, що я намагався реалізувати раніше, але безрезультатно.
голоси

Так що все-таки я хочу відзначити це як відповідь, але я читав цей файл і ..може ви вказали на конкретні рядки коду, які викликають цей ефект? Здається, це більше, ніж лише функції, згадані в коментарях. Це можуть бути просто мої втомлені очі, але я не можу багато цього розуміти.
голоси

@ tjt263 Ніколи не знаходив часу, щоб це зрозуміти
nohillside

@ tjt263 Насправді це все від коментаря до кінця файлу. В основному він використовується trapдля того, щоб підхопити кінець сеансу та зберігати його історію у файлі / файлі, що стосується конкретного сеансу.
nohillside

7

Наскільки я можу сказати, він просто зберігає текст у буфері прокрутки кожного вікна. Це фактично не зберігає стан того, що працює в терміналах; він просто запускає нову оболонку після перезавантаження.

В якості експерименту визначте змінну в оболонці та перевірте її значення:

foo=bar
echo $foo

Потім перезавантажте та ще раз перевірте значення змінної. Ви побачите, що це більше не визначено.


Вау! Інакше було б моторошно.
uhoh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.