¿Cómo persisten las sesiones de terminal OS X durante los reinicios?


14

Siendo un ávido usuario de Linux antes de comprar una MacBook Pro, normalmente tengo varias pestañas de terminal abiertas al mismo tiempo.

En el pasado, los bloqueos y reinicios generalmente arruinaban mi flujo de trabajo y la mayoría de mis respectivos historiales de pestañas. Busqué formas de resolver este problema pero siempre aparecía vacío; Aparte de diversas técnicas que las combinaciones utilizadas de herramientas como ssh, screen, tmux, y se requiere un servidor privado virtual (o similar).

Una de mis cosas favoritas sobre el uso de mi MacBook Pro para escribir scripts, y el uso de herramientas CLI, etc. es que mis sesiones de terminal persisten más allá de bloqueos y reinicios por defecto. De hecho, acabo de restaurar una copia de seguridad de hace casi 2 años, y cuando inicié sesión por primera vez, me presentaron mi antiguo escritorio y tres bashshells que comprendían un proyecto en el que estaba trabajando hace tanto tiempo.

Me gustaría saber cómo OS X hace posible esta función. ¿Alguien aquí tiene una idea de cómo funciona?

Respuestas:


10

El código para restaurar Terminal (en realidad, bashsesiones) es parte del /etc/bashrc_Apple_Terminalcual se obtiene /etc/profiley /etc/bashrcpara cada bashsesión que se ejecuta en 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

1
Genial, ¿son estos comentarios /etc/bashrc_Apple_Terminal? Me gusta especialmente eso. # 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.Es algo más que he intentado implementar antes, pero fue en vano.
voces

De todos modos, quiero marcar esto como la respuesta, pero he estado leyendo este archivo y ... ¿puede señalar las líneas de código específicas que causan este efecto? Parece que hay más que solo las funciones mencionadas en los comentarios. Podrían ser mis ojos cansados, pero no puedo entenderlo.
voces

@ tjt263 Nunca encontré tiempo para resolver eso todavía
nohillside

@ tjt263 Es todo, desde el comentario hasta el final del archivo, en realidad. Básicamente se utiliza trappara capturar el final de una sesión y almacenar su historial en un archivo específico de pestaña / sesión.
nohillside

7

Por lo que puedo decir, solo guarda el texto en el búfer de desplazamiento de cada ventana. En realidad, no guarda el estado de lo que se estaba ejecutando en las terminales; solo comienza un nuevo shell después del reinicio.

Como experimento, defina una variable en su shell y verifique su valor:

foo=bar
echo $foo

Luego reinicie y verifique nuevamente el valor de la variable. Verás que ya no está definido.


¡Uf! Eso habría sido espeluznante de lo contrario.
uhoh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.