Как сеансы терминала OS X сохраняются после перезагрузок?

14

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

В прошлом сбои и перезагрузки обычно приводили к потере моего рабочего процесса и большинства моих историй вкладок. Я искал способы решить эту проблему, но всегда оказывался пустым; в стороне от различных методов , которые использованы комбинации инструментов , таких как ssh, screen, tmux, и требуется виртуальный частный сервер (или аналогичный).

Одна из моих любимых вещей - использование моего MacBook Pro для написания скриптов, использование инструментов CLI и т. Д .; в том, что мои терминальные сессии сохраняются после сбоев и перезагружаются по умолчанию. Фактически, я только что восстановил резервную копию почти 2 года назад, и когда я вошел в систему в первый раз, мне представили мой старый рабочий стол и три bashоболочки, которые составляли проект, над которым я работал все это время назад.

Я хотел бы знать, как OS 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
Nohillside
источник
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для того, чтобы перехватить конец сеанса и сохранить его историю в отдельном файле вкладки / сеанса.
холме
7

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

В качестве эксперимента определите переменную в вашей оболочке и проверьте ее значение:

foo=bar
echo $foo

Затем перезагрузите компьютер и снова проверьте значение переменной. Вы увидите, что это больше не определено.

Wyzard
источник
Уф! Это было бы жутко иначе.
ухо