เทอร์มินัล - วิธีการรีสตาร์ทเซสชันหลังจากออกโดยไม่ตั้งใจ?


22

บางครั้งฉันออกจากเซสชันเทอร์มินัลโดยไม่ตั้งใจ (โดยปกติคือฉันคิดว่าฉันเชื่อมต่อกับระบบรีโมตเมื่อไม่ได้ใช้) ดังนั้นฉันจึงไปที่จุดนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะเริ่มต้นเซสชันใหม่ได้อย่างไร ณ จุดนี้ ฉันไม่ต้องการปิดหน้าต่างหรือแท็บเพราะฉันมีแท็บจำนวนมากที่ตั้งค่าไว้สำหรับเวิร์กโฟลว์ปกติของฉันดังนั้นฉันแค่ต้องการให้เซสชันในแท็บปัจจุบันกลับมาทำงานอีกครั้ง (เช่นกลับไปที่ bash prompt)

วิธีแก้ปัญหาเดียวที่ฉันพบคือการออกจากเทอร์มินัลอย่างสมบูรณ์และเปิดอีกครั้ง แต่มันก็ยังไม่เหมาะอย่างยิ่งเพราะมันขัดจังหวะทุกอย่างที่ฉันทำในหน้าต่างแท็บ / เทอร์มินัลอื่น ๆ


1
ตัวเลียนแบบเทอร์มินัล Linux (KDE / Gnome) ช่วยให้คุณสามารถสั่งซื้อแท็บได้อีกครั้ง ดังนั้นหากคุณเริ่มแท็บใหม่คุณสามารถเลื่อนไปเพื่อแทนที่แท็บที่คุณปิด เทอร์มินัลของ OS X ไม่มีหรือ (ฉันไม่ใช่คน Mac ฉันเพิ่งเห็นสิ่งนี้ใน "คำถามเครือข่ายร้อนแรง") ฉันยังต้องการใช้หน้าจอ GNU เพื่อเพิ่มจำนวนเซสชันเชลล์จำนวนมากแทนที่จะใช้แท็บในหน้าต่างเทอร์มินัล ฉันมีแท็บอื่นที่มีเซสชันหน้าจอในคอมพิวเตอร์เครื่องอื่น บางครั้งฉันเปิดเทอร์มินัลอื่นถ้าฉันต้องการเห็นสองสิ่งพร้อมกัน แต่โดยปกติฉันชอบที่จะมีหมายเลขของเปลือกหอยวิธีที่หน้าจอทำได้ดีกว่าที่นั่น
Peter Cordes

1
อย่างไรก็ตามฉันแนะนำหน้าจอ (หรือ tmux หากคุณยังไม่รู้จักหน้าจอ) สำหรับเก็บเชลล์หลาย ๆ ตัวไว้บนโฮสต์เดียวกันในแท็บ GUI เดียว ลำดับชั้นสองระดับของแท็บ / หน้าต่างหน้าจอช่วยให้มีสิ่งต่าง ๆ มากมายเปิดอยู่โดยไม่สูญเสียสิ่งที่เกิดขึ้น นอกจากนี้อย่างที่ฉันบอกว่าการมีตัวเลขสำหรับกระสุนที่แตกต่างกันทำให้ง่ายต่อการจำหมายเลขที่จะเปลี่ยนเป็น ( ^t 8ตัวอย่าง) สำหรับบริบทที่กำหนดแทนที่จะมองเห็นนับแท็บที่จะคลิกหรือ (หรือจำนวน ctrl-pgup ที่จะตี) .
Peter Cordes

1
หน้าจอและ tmux ทั้งคู่มี scrollback ที่กำหนดค่าได้ในแต่ละหน้าจอหน้าต่าง ฉันจำไม่ได้ว่าเห็นอะไรเกี่ยวกับการเก็บ scrollback ไว้ในดิสก์เพื่อคงอยู่ในการรีบูตเครื่อง! นั่นมันเรียบร้อย สามแท็บนั้นง่ายพอที่จะติดตามจิตใจ ฉันมักจะมีบางอย่างเช่น 10 บนเดสก์ทอปที่บ้านของฉันเนื่องจากฉันทำเกือบทุกอย่างจากบรรทัดคำสั่งไม่ใช่เบราว์เซอร์ไฟล์ GUI (การเล่นวิดีโอ / หนังสือเสียง ฯลฯ ) ฉันมักจะมีประมาณสาม shell cded ไปยังซอร์สโค้ดเมื่อฉันทำงานกับโค้ดเพื่อให้ตรงกับการใช้งานของคุณ
Peter Cordes

1
อย่างไรก็ตามการลากแท็บไปรอบ ๆ ควรทำให้ง่ายต่อการกู้คืนจากการปิดแท็บโดยไม่ได้ตั้งใจเนื่องจากคุณสามารถวางกลับไปที่ตำแหน่งเดิมได้
Peter Cordes

1
ฉันไม่คิดว่าผู้คนจำนวนมากใช้มันในพื้นที่สำหรับเซสชันเชลล์ในเครื่องภายในแท็บเทอร์มินัลอีมูเลเตอร์เดียว IDK หรือบางทีอาจเป็นเพราะคนอื่น ๆ ก็ทำเช่นกัน กรณีการใช้งานหลักคือหลังจากที่sshบางแห่ง ฉันเพิ่งคุ้นเคยกับการใช้หน้าจอและใช้งานในพื้นที่เช่นเดียวกับในเซสชันระยะไกล ตามที่ฉันเข้าใจแล้วถ้าคุณยังไม่มีscreenหน่วยความจำในกล้ามเนื้อของคุณให้เรียนรู้ tmux เพราะหน้าจอนั้นเก่าและสกปรก ฉันอาจเปลี่ยนไปใช้tmuxและตั้งค่าให้ใช้ keybinds แบบเดียวกับที่ฉันใช้screenแต่หน้าจอยังใช้งานได้ดีสำหรับฉัน
Peter Cordes

คำตอบ:


26

ณ จุดนี้ไม่มีวิธีในการดึงแท็บกลับมา เทอร์มินัลเซสชันถูกปิดและไม่มี TTY อีกต่อไป ไม่มีทางที่จะอ้างอิงแท็บเพื่อทำสิ่งที่ฉลาด ฉันขอแนะนำให้เพิ่มฟังก์ชันนี้ใน. bashrc หรือ. profile ของคุณเพื่อที่คุณจะไม่มีปัญหาในอนาคต:

exit() {
    read -t5 -n1 -p "Do you really wish to exit? [yN] " should_exit || should_exit=y
    case $should_exit in
        [Yy] ) builtin exit $1 ;;
        * ) printf "\n" ;;
    esac
}

หรือสำหรับพวกเราที่ใช้ Z Shell (เพิ่มลงใน. zshrc ของคุณ):

exit() {
    if read -t5 -q should_exit\?"Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

มันเป็นอุปสรรคเล็ก ๆ ที่ดีระหว่างคุณกับคำสั่ง exit ที่น่ารำคาญ! ท่านรู้ดีว่าฉันเคยทำสิ่งเดียวกันหลายครั้งในอดีต


1
คุณเข้าใจแล้ว! ตอนนี้หลังจาก 5 วินาที ( -t 5ตัวเลือก) คำสั่งอ่านจะล้มเหลวซึ่งก่อให้เกิดคำสั่งทางออกต่อไปนี้
William T Froggard

1
ยอดเยี่ยม - ขอบคุณ - ฉันหวังว่าฉันจะให้คุณได้รับสองคะแนนขึ้นไป! ;-)
Paul R

1
@PaulR: คุณไม่จำเป็นต้องใช้นามแฝงexitหากคุณใช้ Bash ~/.bash_logoutคุณสามารถวางสคริปต์ของคุณใน
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

2
@DennisWilliamson: แนวคิดที่น่าสนใจ แต่ฉันไม่แน่ใจว่าคุณจะยกเลิกการออกจากระบบได้.bash_logoutอย่างไร?
Paul R

3
@PaulR: โอ๊ะโอ ฉันไม่สามารถพิจารณาได้! เพื่อความสมบูรณ์คุณควรlogoutตั้งชื่อแทนและตั้งค่าIGNOREEOFมากกว่า 1 (หรือ rebind ^ D)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

5

สคริปต์ของ William T Froggard ไม่ได้ทำในสิ่งที่ฉันต้องการเพราะโดยทั่วไปแล้ววิธีเดียวที่ฉันเข้าสู่สถานการณ์นี้คือผ่าน ^ D ( ctrl+ D) และการกำหนดใหม่exitไม่ได้ทำอะไรกับสถานการณ์นั้น สำหรับฉันคำแนะนำของเดนนิสวิลเลียมสันเกี่ยวกับสภาพแวดล้อมIGNOREEOFก็เพียงพอแล้ว ฉันเพิ่งเพิ่ม:

# Do not exit on a single ^D, require 2 in a row
IGNOREEOF=1

ไปที่~/.bashrcไฟล์ของฉันและตอนนี้ (ถ้าฉันอยู่ในเชลล์ระดับบนสุดและจะออกจากเทอร์มินัล) ^ D แรกสร้างการตอบสนอง:

Use "logout" to leave the shell.

หากฉันพิมพ์ ^ D อีกครั้งในทันทีเชลล์จะออกดังนั้นการออกเมื่อฉันต้องการยังคงเป็นเรื่องง่าย แต่ตอนนี้ ^ D เดียวจะให้คำเตือนแก่ฉัน (หากคุณต้องการคุณสามารถตั้งค่าIGNOREEOFเป็นตัวเลขที่สูงกว่าเพื่อต้องการเพิ่มเติม ^ D ติดต่อกัน)

มีประโยชน์ด้วยถ้าฉันอยู่ใน sub-shell ตัวแรก ^ D จะสร้างการตอบกลับ:

Use "exit" to leave the shell.

อีกครั้ง ^ D พิเศษจะพาฉันออกไปและตอนนี้ฉันสามารถบอกความแตกต่างระหว่างการออกจากเชลล์ย่อยและออกจากเชลล์ระดับบนสุดได้

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