เซสชันเทอร์มินัล OS X ยังคงมีอยู่ผ่านการรีบูตอย่างไร


14

การเป็นผู้ใช้ Linux ตัวยงก่อนที่จะซื้อ MacBook Pro ฉันมักจะเปิดแท็บเทอร์มินัลหลายแท็บไว้ในคราวเดียว

ในอดีตการขัดข้องและการรีบูตโดยทั่วไปจะทำให้ขั้นตอนการทำงานของฉันและประวัติแท็บส่วนใหญ่ของฉันเกี่ยวข้อง ฉันค้นหาวิธีการแก้ปัญหานี้ แต่มักจะว่างเปล่า; นอกเหนือจากเทคนิคต่างๆที่รวมกันใช้ของเครื่องมือชอบssh, screen, tmuxและจำเป็นต้องใช้เซิร์ฟเวอร์ส่วนตัวเสมือน (หรือคล้ายกัน)

หนึ่งในสิ่งที่ฉันโปรดปรานเกี่ยวกับการใช้ MacBook Pro ของฉันสำหรับการเขียนสคริปต์และการใช้เครื่องมือ CLI เป็นต้น คือเซสชันเทอร์มินัลของฉันยังคงมีอยู่มากกว่าการขัดข้องและเริ่มต้นใหม่โดยค่าเริ่มต้น ในความเป็นจริงฉันเพิ่งคืนค่าการสำรองข้อมูลจากเกือบ 2 ปีที่แล้วและเมื่อฉันเข้าสู่ระบบเป็นครั้งแรกฉันได้รับการนำเสนอด้วยเดสก์ท็อปเก่าและสามbashเชลล์ที่ประกอบด้วยโครงการที่ฉันทำงานอยู่ตลอดเวลาที่ผ่านมา

ฉันต้องการทราบว่า 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

จากนั้นรีบู๊ตและตรวจสอบค่าของตัวแปรอีกครั้ง คุณจะเห็นว่ามันไม่ได้ถูกกำหนดไว้แล้ว


ต๊าย! ที่จะน่าขนลุกเป็นอย่างอื่น
uhoh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.