21 votes

Comment les sessions de terminal OS X persistent-elles lors des redémarrages ?

Étant un fervent utilisateur de Linux avant d'acheter un MacBook Pro, j'ai généralement plusieurs onglets de terminal ouverts à tout moment.

Dans le passé, les pannes et les redémarrages détruisaient généralement mon flux de travail et la majorité de l'historique de mes onglets respectifs. J'ai cherché des moyens de résoudre ce problème, mais je n'ai jamais rien trouvé, à part diverses techniques utilisant des combinaisons d'outils tels que ssh , screen , tmux et nécessitait un serveur privé virtuel (ou similaire).

L'une des choses que je préfère dans l'utilisation de mon MacBook Pro pour écrire des scripts, et utiliser des outils CLI, etc ; c'est que mes sessions de terminal persistent au-delà des plantages et des redémarrages par défaut. En fait, je viens de restaurer une sauvegarde d'il y a presque 2 ans, et lorsque je me suis connecté pour la première fois, j'ai été présenté avec mon ancien bureau et trois bash des coquilles qui comprenaient un projet sur lequel je travaillais il y a longtemps.

J'aimerais savoir comment OS X rend cette fonctionnalité possible. Quelqu'un ici a-t-il une idée de la façon dont cela fonctionne ?

15voto

nohillside Points 82672

Le code pour restaurer le terminal (en fait bash sessions) fait partie de /etc/bashrc_Apple_Terminal qui s'approvisionne auprès de /etc/profile y /etc/bashrc pour chaque bash en cours d'exécution dans un 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 votes

Cool, tout comme ces commentaires de /etc/bashrc_Apple_Terminal ? J'apprécie particulièrement que # 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. C'est une autre chose que j'ai essayé de mettre en œuvre auparavant, mais sans succès.

1 votes

De toute façon, je veux marquer cette réponse, mais j'ai lu ce fichier et pouvez-vous indiquer les lignes de code spécifiques qui provoquent cet effet ? Il semble qu'il y ait plus que les fonctions mentionnées dans les commentaires. C'est peut-être mes yeux fatigués, mais je n'arrive pas à y voir clair.

0 votes

@tjt263 Je n'ai pas encore trouvé le temps de le découvrir.

9voto

Wyzard Points 239

D'après ce que je sais, il ne fait que sauvegarder le texte dans le tampon de retour de défilement de chaque fenêtre. Il ne sauvegarde pas réellement l'état de ce qui était en cours d'exécution dans les terminaux ; il démarre simplement un nouveau shell après le redémarrage.

À titre expérimental, définissez une variable dans votre shell, et vérifiez sa valeur :

foo=bar
echo $foo

Puis redémarrez, et vérifiez à nouveau la valeur de la variable. Vous verrez qu'elle n'est plus définie.

0 votes

Ouf ! Ça aurait été effrayant autrement.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X