ป้องกันบานหน้าต่าง / หน้าต่างจากการปิดเมื่อคำสั่งเสร็จสมบูรณ์ - tmux


33

ในtmux.confไฟล์ของฉันฉันได้รับการกำหนดค่าให้เปิดหน้าต่างตั้งชื่อพวกเขาตั้งค่าบานหน้าต่าง ฯลฯ ฯลฯ

อย่างไรก็ตามสิ่งหนึ่งที่ฉันมีคือถ้าหนึ่งในบานหน้าต่างเรียกคำสั่งสมมติว่าlsบานหน้าต่างจะปิดตัวเองหลังจากคำสั่งเสร็จสิ้น (ทันที) มีวิธีป้องกันพฤติกรรมนี้หรือไม่? หรือปล่อยมันไปที่เปลือกปกติหลังจากคำสั่งเสร็จสมบูรณ์?

ฉันสมมติว่าฉันต้องเริ่มเชลล์ -> execute คำสั่งเมื่อบานหน้าต่างเปิดตัว แต่ฉันจะถูกสาปถ้าฉันสามารถหาวิธีได้ ฉันแก้ปัญหานี้ไปเล็กน้อยแล้ว

คำตอบ:


22

คุณมีสองทางเลือก

  1. แทนที่จะเรียกใช้lsในหน้าต่างของคุณให้เรียกใช้เชลล์แล้วส่งการกดแป้นเชลล์เพื่อดำเนินการ:

    tmux start-server  
    tmux new-session -d -s session  
    tmux new-window -t session:1  
    tmux send-keys -t session:1 ls C-m
    
  2. คุณสามารถสั่งอาหารกลางวันตามลำดับของคำสั่งในลักษณะที่จะปล่อยให้ตัวเองอยู่กับ bash shell หลังจากที่คำสั่งอื่นของคุณทำงาน:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. ดูคำตอบของ jasonwryanสำหรับรายละเอียดเกี่ยวกับremain-on-exitตัวเลือกเพื่อให้บานหน้าต่างมีชีวิตอยู่หลังจากกระบวนการของพวกเขาได้ออกไปแล้วเพื่อให้คุณสามารถตรวจสอบผลลัพธ์ได้

  4. หากเอาต์พุตของคำสั่งบางคำสั่งมีค่าที่จะเห็นเพียงครั้งเดียว หากคุณกำลังตรวจสอบผลลัพธ์ของสิ่งที่คุณสามารถทำได้watchเพื่อรับเอาท์พุทใหม่เป็นระยะ สิ่งนี้ควรเล่นได้ดีกับบานหน้าต่างในtmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    

ขอบคุณคน! คำตอบที่น่ากลัวข้อที่ 2 และข้อที่ 4 เป็นสิ่งที่ฉันทำงาน แต่สิ่งที่ฉันต้องการก็เป็นทางเลือกที่ยอดเยี่ยมเช่นกัน ขอบคุณสำหรับความช่วยเหลือทั้งหมดที่ได้รับการชื่นชม (คุณทั้งคู่)
23411 Stew

1
ข้อได้เปรียบของ # 1 คือคำสั่งยังคงอยู่ในประวัติเชลล์และสามารถเรียกใช้ซ้ำได้อย่างง่ายดาย หากคำสั่งนั้นใหญ่และน่าเกลียดนี่ก็มีประโยชน์มาก
goertzenator

1
มันใช้งานได้สำหรับฉันโดยไม่มีstart-serverคำสั่งฉันคิดว่ามันจะเริ่มโดยอัตโนมัติหากจำเป็น มีข้อได้เปรียบในการเรียกมันว่ากระนั้นชัดเจนหรือไม่?
ชำระเงิน

1
@luator ฉันคิดว่าการเริ่มต้นเซิร์ฟเวอร์โดยอัตโนมัติหากไม่พบอาจถูกเพิ่มลงไปtmuxตั้งแต่ฉันเขียนคำตอบนี้ ฉันไม่ทราบถึงข้อได้เปรียบใด ๆ หากรุ่นของคุณวางกระบวนการเซิร์ฟเวอร์หากจำเป็น
Caleb

13

คุณสามารถใช้remain-on-exitตัวเลือก:

ยังคงอยู่บนทางออก [บน | ปิด]
หน้าต่างที่มีการตั้งค่าสถานะนี้จะไม่ถูกทำลายเมื่อโปรแกรมที่ทำงานอยู่หยุดทำงาน หน้าต่างอาจถูกเปิดใช้งานอีกครั้งด้วยคำสั่ง respawn-window

หากต้องการทำให้กระบวนการ respawning ง่ายขึ้นคุณอาจต้องการผูกกับคีย์:

bind-key R respawn-window

สิ่งนี้จะช่วยให้คุณไม่ทิ้งหน้าต่างที่ตายแล้วเมื่อโปรแกรมออก


ฉันไปถึงที่นั่น! ฉันหมดเวลาและตัดสินใจว่าจะต้องแก้ไขคำตอบของฉัน ใช่นี่เป็นตัวเลือกที่สามข้อเสียเปรียบหลักคือมันปล่อยให้หน้าต่างอ่านอย่างเดียวซึ่งคุณไม่สามารถนำกลับมาใช้ใหม่ได้หากไม่ได้สร้างขึ้นใหม่
Caleb

จุดดี. ฉันได้อัปเดตด้วยวิธีแก้ปัญหา (กึ่ง)
jasonwryan

ใช้ได้กับบานหน้าต่างหรือไม่
azmeuk

1
การตั้งค่านี้จากบรรทัดคำสั่งสามารถทำได้ด้วยtmux set-option remain-on-exit on
rmanna

1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace

1

นี่คือตัวอย่างเพิ่มเติมโดยใช้send-keysวิธีการที่แนะนำโดย @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.