Jak utrzymują się sesje terminalowe OS X po ponownym uruchomieniu?

14

Będąc zapalonym użytkownikiem Linuksa przed zakupem MacBooka Pro, zazwyczaj mam kilka kart terminalu otwartych jednocześnie.

W przeszłości awarie i restarty generalnie niszczyłyby mój przepływ pracy i większość historii moich kart. Szukałem sposobów rozwiązania tego problemu, ale zawsze wydawałem się pusty; oprócz różnych technik, które stosowane kombinacje narzędzi podoba ssh, screen, tmuxi wymagane wirtualny serwer prywatny (lub podobny).

Jedną z moich ulubionych rzeczy na temat używania mojego MacBooka Pro do pisania skryptów i używania narzędzi CLI itp .; jest to, że moje sesje terminali domyślnie trwają dłużej niż awarie i restarty. W rzeczywistości właśnie przywróciłem kopię zapasową sprzed prawie 2 lat, a kiedy zalogowałem się po raz pierwszy, otrzymałem mój stary pulpit i trzy bashpowłoki, które zawierały projekt, nad którym pracowałem cały czas temu.

Chciałbym wiedzieć, w jaki sposób OS X umożliwia tę funkcję. Czy ktoś tu ma wgląd w to, jak to działa?

głosy
źródło

Odpowiedzi:

10

Kod przywrócić Terminal (faktycznie bashsesje) jest częścią /etc/bashrc_Apple_Terminal, która dostaje pozyskiwane przez /etc/profilei /etc/bashrcdla każdej bashsesji działającej w Terminalu.

# 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
źródło
1
Fajnie, więc skąd te komentarze /etc/bashrc_Apple_Terminal? Szczególnie podoba mi się, że # 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.to coś, co próbowałem wcześniej wdrożyć, ale bezskutecznie.
głosy
W każdym razie chcę zaznaczyć to jako odpowiedź, ale czytałem ten plik i ... czy możesz wskazać konkretne wiersze kodu, które powodują ten efekt? Wydaje się, że jest w tym coś więcej niż tylko funkcje wymienione w komentarzach. Mogą to być po prostu moje zmęczone oczy, ale nie mam większego sensu.
Głosy
@ tjt263 Nigdy nie znalazłem czasu, aby się z tym
pogodzić
@ tjt263 To wszystko od komentarza aż do końca pliku. Zasadniczo służy trapdo przechwytywania końca sesji i przechowywania jego historii w pliku specyficznym dla karty / sesji.
nohillside
7

O ile wiem, po prostu zapisuje tekst w buforze przewijania każdego okna. W rzeczywistości nie zapisuje stanu tego, co działało w terminalach; po prostu uruchamia nową powłokę po ponownym uruchomieniu.

W ramach eksperymentu zdefiniuj zmienną w swojej powłoce i sprawdź jej wartość:

foo=bar
echo $foo

Następnie uruchom ponownie i ponownie sprawdź wartość zmiennej. Zobaczysz, że nie jest już zdefiniowany.

Wyzard
źródło
Uff! W przeciwnym razie byłoby to przerażające.
uhoh