Wie bleiben OS X-Terminalsitzungen beim Neustart erhalten?

14

Als begeisterter Linux-Benutzer habe ich vor dem Kauf eines MacBook Pro in der Regel mehrere Terminal-Registerkarten gleichzeitig geöffnet.

In der Vergangenheit haben Abstürze und Neustarts in der Regel meinen Workflow und den Großteil meiner jeweiligen Registerkartenverläufe in Mitleidenschaft gezogen. Ich suchte nach Wegen, um dieses Problem zu lösen, kam aber immer leer aus; abgesehen von verschiedenen Techniken , die verwendeten Kombinationen von Werkzeugen wie ssh, screen, tmuxund ein Virtual Private Server (oder ähnlich) erforderlich.

Eine meiner Lieblingsbeschäftigungen bei der Verwendung meines MacBook Pro zum Schreiben von Skripten und der Verwendung von CLI-Tools usw .; ist, dass meine Terminalsitzungen über Abstürze hinaus bestehen und standardmäßig neu gestartet werden. Tatsächlich habe ich gerade ein Backup von vor fast 2 Jahren wiederhergestellt, und als ich mich zum ersten Mal anmeldete, wurden mir mein alter Desktop und drei bashShells präsentiert, die ein Projekt enthielten, an dem ich die ganze Zeit zuvor gearbeitet habe.

Ich würde gerne wissen, wie OS X diese Funktion ermöglicht. Hat hier jemand einen Einblick, wie es funktioniert?

Stimmen
quelle

Antworten:

10

Der Code wiederherzustellen Klemme (tatsächlich bashSitzungen) Teil ist , /etc/bashrc_Apple_Terminaldie durch sourced wird /etc/profileund /etc/bashrcfür jede bashSitzung in Terminal läuft.

# 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
quelle
1
Cool, also kommen diese Kommentare von /etc/bashrc_Apple_Terminal? Das gefällt mir besonders gut. # 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.Das habe ich schon früher versucht, aber ohne Erfolg.
Stimmen
Trotzdem möchte ich dies als Antwort markieren, aber ich habe diese Datei gelesen und ..können Sie auf die spezifischen Codezeilen hinweisen, die diesen Effekt verursachen? Es scheint mehr zu sein als nur die in den Kommentaren erwähnten Funktionen. Es könnten nur meine müden Augen sein, aber ich kann nicht viel Sinn machen.
Stimmen
@ tjt263 Ich habe noch keine Zeit gefunden, das herauszufinden
nohillside
@ tjt263 Eigentlich ist es alles vom Kommentar bis zum Ende der Datei. Grundsätzlich wird verwendet trap, um das Ende einer Sitzung zu erfassen und den Verlauf in einer tab- / sitzungsspezifischen Datei zu speichern.
Nohillside
7

Soweit ich das beurteilen kann, wird nur der Text im Scrollback-Puffer jedes Fensters gespeichert. Es speichert nicht wirklich den Status dessen, was in den Terminals lief. Nach dem Neustart wird nur eine neue Shell gestartet.

Definieren Sie als Experiment eine Variable in Ihrer Shell und überprüfen Sie deren Wert:

foo=bar
echo $foo

Starten Sie dann neu und überprüfen Sie den Wert der Variablen erneut. Sie werden sehen, dass es nicht mehr definiert ist.

Wyzard
quelle
Wütend! Das wäre sonst gruselig gewesen.
Uhoh