OS Xターミナルセッションは再起動後もどのように持続しますか?


14

MacBook Proを購入する前は熱心なLinuxユーザーであるため、通常は一度に複数の端末タブを開いています。

過去には、クラッシュと再起動により、一般的にワークフローと、それぞれのタブ履歴の大部分が破壊されていました。この問題を解決する方法を探しましたが、いつも空っぽでした。脇ツールの利用の組み合わせが好きなことを、種々の技術からsshscreentmux、および仮想プライベートサーバ(または類似の)を必要としました。

MacBook Proを使用してスクリプトを記述したり、CLIツールなどを使用したりすることに関する私のお気に入りの1つ。私の端末セッションは、デフォルトではクラッシュや再起動を超えて持続します。実際、ほぼ2年前のバックアップを復元したばかりで、初めてログインしたときに、古いデスクトップと、それ以前bashに取り組んでいたプロジェクトを構成する3つのシェルが表示されました。

OS Xがこの機能をどのように可能にするかを知りたい。ここの誰かがそれがどのように機能するかについての洞察を持っていますか?

回答:


10

ターミナル(実際にはbashセッション)を復元するためのコードは、ターミナルで実行されている各セッションを/etc/bashrc_Apple_Terminal介して/etc/profile、およびセッション/etc/bashrcごとにソースされbashます。

# 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
かっこいいので、これらのコメントは/etc/bashrc_Apple_Terminal?私は特に# 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.それが好きですそれは私が以前に実装しようとしたが、役に立たない何かです。

とにかく、これを答えとしてマークしたいのですが、このファイルを読んでいます。この効果を引き起こす特定のコード行を指摘できますか?コメントで言及されている機能以上のものがあるようです。それは私の疲れた目かもしれませんが、私はそれをあまり理解できません。

@ tjt263まだそれを理解する時間を見つけられなかった
nohillside

@ tjt263実際には、コメントからファイルの終わりまでのすべてです。基本的trapに、セッションの終了をキャッチし、その履歴をタブ/セッション固有のファイルに保存するために使用します。
nohillside

7

私が知る限り、各ウィンドウのスクロールバックバッファーにテキストを保存するだけです。実際には、端末で実行されていた状態を保存しません。再起動後に新しいシェルを開始するだけです。

実験として、シェルで変数を定義し、その値を確認します。

foo=bar
echo $foo

次に、リブートして、変数の値を再度確認します。定義されていないことがわかります。


ふう!そうでなければ、それは不気味だったでしょう。
うーん
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.