Come persistono le sessioni del terminale OS X attraverso i riavvii?


14

Essendo un avido utente Linux prima di acquistare un MacBook Pro, in genere ho diverse schede terminali aperte contemporaneamente.

In passato, gli arresti anomali e i riavvii in genere eliminavano il mio flusso di lavoro e la maggior parte delle mie rispettive cronologie di schede. Ho cercato modi per risolvere questo problema, ma mi è sempre venuto in mente vuoto; Oltre a varie tecniche che combinazioni utilizzate di strumenti come ssh, screen, tmux, e ha richiesto un server privato virtuale (o simile).

Una delle mie cose preferite sull'uso del mio MacBook Pro per la scrittura di script e l'uso degli strumenti della CLI, ecc .; è che le mie sessioni terminali persistono oltre gli arresti anomali e i riavvii per impostazione predefinita. In effetti, ho appena ripristinato un backup di quasi 2 anni fa e quando ho effettuato l'accesso per la prima volta, mi è stato presentato il mio vecchio desktop e tre bashshell che comprendevano un progetto su cui stavo lavorando da tempo.

Vorrei sapere come OS X rende possibile questa funzione. Qualcuno qui ha un'idea di come funziona?

Risposte:


10

Il codice per ripristinare Terminal (in realtà bashsessioni) è parte del /etc/bashrc_Apple_Terminalquale viene fornito /etc/profilee /etc/bashrcper ogni bashsessione in esecuzione in 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
Bene, quindi sono questi commenti da /etc/bashrc_Apple_Terminal? Mi piace soprattutto # 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.questo è qualcos'altro che ho provato a implementare prima, ma senza risultati.
Voci del

Quindi, comunque, desidero contrassegnare questa come risposta, ma ho letto questo file e ... puoi indicare le righe di codice specifiche che causano questo effetto? Sembra che ci sia molto altro oltre alle funzioni menzionate nei commenti. Potrebbe essere solo i miei occhi stanchi, ma non riesco a capirlo molto.
esprime il

@ tjt263 Non ho ancora trovato il tempo di capirlo
nohillside

@ tjt263 In realtà è tutto dal commento fino alla fine del file. Fondamentalmente utilizza trapper catturare la fine di una sessione e memorizzare la sua cronologia in un file specifico di scheda / sessione.
Nohillside

7

Per quanto ne so, salva solo il testo nel buffer di scorrimento di ciascuna finestra. In realtà non salva lo stato di ciò che era in esecuzione nei terminali; avvia solo una nuova shell dopo il riavvio.

Come esperimento, definisci una variabile nella tua shell e verificane il valore:

foo=bar
echo $foo

Quindi riavviare e controllare nuovamente il valore della variabile. Vedrai che non è più definito.


Meno male! Altrimenti sarebbe stato inquietante.
uho
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.