Como as sessões de terminal do OS X persistem durante as reinicializações?

14

Sendo um usuário ávido de Linux antes de comprar um MacBook Pro, normalmente tenho várias guias de terminal abertas ao mesmo tempo.

No passado, falhas e reinicializações geralmente jogavam lixo no meu fluxo de trabalho e na maioria dos meus respectivos históricos de guias. Eu procurei maneiras de resolver esse problema, mas sempre aparecia vazio; além de várias técnicas que as combinações utilizadas de ferramentas como ssh, screen, tmux, e exigiu um servidor virtual privado (ou similar).

Uma das minhas coisas favoritas sobre o uso do meu MacBook Pro para escrever scripts e o uso de ferramentas CLI, etc; é que minhas sessões de terminal persistem além de falhas e reinicializações por padrão. Na verdade, eu apenas restaurei um backup de quase dois anos atrás e, quando entrei pela primeira vez, fui presenteado com minha área de trabalho antiga e três bashshells que compunham um projeto em que eu estava trabalhando há muito tempo.

Gostaria de saber como o OS X torna esse recurso possível. Alguém aqui tem uma visão de como isso funciona?

vozes
fonte

Respostas:

10

O código para restaurar o Terminal (na verdade bashsessões) faz parte do /etc/bashrc_Apple_Terminalqual é obtido através de /etc/profilee /etc/bashrcpara cada bashsessão em execução no 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
fonte
1
Legal, então são esses comentários /etc/bashrc_Apple_Terminal? Eu gosto especialmente disso. # 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.Isso é outra coisa que eu tentei implementar antes, mas sem sucesso.
vozes
Enfim, de qualquer forma, quero marcar isso como a resposta, mas estive lendo este arquivo e ..pode apontar as linhas de código específicas que causam esse efeito? Parece haver mais do que apenas as funções mencionadas nos comentários. Poderia ser apenas meus olhos cansados, mas não consigo entender muito.
vozes
@ tjt263 Nunca encontrei tempo para descobrir isso ainda
nohillside
@ tjt263 É tudo, desde o comentário até o final do arquivo, na verdade. Basicamente, ele usa trappara capturar o final de uma sessão e armazenar seu histórico em um arquivo específico da guia / sessão.
nohillside
7

Até onde eu sei, ele apenas salva o texto no buffer de rolagem de cada janela. Na verdade, ele não salva o estado do que estava sendo executado nos terminais; apenas inicia um novo shell após a reinicialização.

Como experiência, defina uma variável no seu shell e verifique seu valor:

foo=bar
echo $foo

Em seguida, reinicie e verifique o valor da variável novamente. Você verá que não está mais definido.

Wyzard
fonte
Ufa! Isso teria sido assustador de outra maneira.
uhoh