รันหรือส่งคำสั่งไปยังบานหน้าต่าง tmux ในเซสชัน tmux ที่รันอยู่


53

ฉันต้องการเขียนเชลล์สคริปต์ซึ่งจะแนบกับเซสชัน tmux ที่มีชื่อเลือกหน้าต่าง (หรือบานหน้าต่าง) ในเซสชันนั้นและเรียกใช้คำสั่งในหน้าต่างที่เลือกนั้น (หรือบานหน้าต่าง)

ฉันจะทำสิ่งนี้จากสคริปต์ทุบตีได้อย่างไร

ฉันรู้ว่า

tmux new-window -n:mywindow 'exec something'

อนุญาตให้ฉันส่งคำสั่งไปยังหน้าต่างที่สร้างขึ้นใหม่ แต่ฉันต้องการอะไร

tmux select-window -t:0 'my command'

ฉันคิดว่าฉันสามารถใช้งานได้send-keysแต่ดูเหมือนว่าควรมีบางสิ่งที่ใช้คำสั่งหรือรายการคำสั่งที่เรียกใช้

คำตอบ:


73

แต่ละบานหน้าต่างtmuxเป็นอินเตอร์เฟสสำหรับ pty เดี่ยว (pseudo tty) หน้าต่างที่ไม่แบ่งมีบานหน้าต่างเดียว หน้าต่างแยกมีหลายบานหน้าต่าง

tmuxไม่ได้จัดหาวิธีในการเพิ่มกระบวนการพิเศษให้กับบานหน้าต่างเมื่อเริ่มต้นด้วยคำสั่งเริ่มต้นแล้ว มันขึ้นอยู่กับกระบวนการของคำสั่งเริ่มต้นนั้น (โดยปกติคือเชลล์) เพื่อจัดหาการควบคุมงาน1สำหรับเทอร์มินัลนั้น

หากคุณต้องการปิดบังสิ่งที่กำลังทำงานอยู่ในบานหน้าต่างคุณสามารถใช้respawn-pane -kเพื่อฆ่าคำสั่งที่มีอยู่และแทนที่ด้วยคำสั่งใหม่ (เช่นrespawn-pane -t sessionname:0.4 -k 'some -new command')

แต่ถ้าคุณต้องการที่จะรักษาสิ่งที่กำลังทำงานอยู่ในบานหน้าต่างแล้วอาจจะมีตัวเลือกที่ไม่ดีที่เพียง“พิมพ์ที่มัน” send-keysกับ

คุณอาจสคริปต์แบบนี้ (แนบล่าสุดเพราะมิฉะนั้นสคริปต์จะรอให้คุณแยกตัวออกก่อนดำเนินการต่อ):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

โปรดทราบว่าในsend-keysคำสั่งคุณควรพิมพ์ตัวอักษร E n t e rเพื่อบอกtmuxให้ส่งคีย์ newline ไปที่หน้าต่าง (โดยปกติคำสั่งทุกคำลงท้ายด้วยEnterคีย์)


1การควบคุมงานคือการอนุญาโตตุลาการระหว่างกลุ่มกระบวนการหลายกลุ่มของเซสชันเดียวที่ใช้ tty เป็นเทอร์มินัลการควบคุม IE, Ctrl+ Zคีย์ระงับและjobs, fgและbgคำสั่งเชลล์


1
ขอบคุณสำหรับสิ่งนี้! ฉันใส่#{session_name}:#{window_index}.#{pane_index}ในบรรทัดสถานะของฉันเพื่อให้ฉันสามารถดูบานหน้าต่างที่จะส่งคำสั่งได้อย่างรวดเร็ว
เงินที่จ่าย

9

คุณสามารถใช้แทนC-m Enterมันเป็นสิ่งเดียวกัน นอกจากนี้ยังtmuxทำให้มันง่ายต่อการส่งไปทางขวาบานหน้าต่าง / ซ้ายโดยใช้หรือ-t right และถ้าคุณต้องการที่จะอยู่บานหน้าต่างในหน้าต่างอื่นเพียงคำนำหน้าด้วยจำนวนหน้าต่างและระยะเวลาเช่น-t left-t 0.right

ตอนนี้คุณสามารถเขียนฟังก์ชัน Bash แบบง่าย ๆ เพื่อรับลำดับของคีย์เป็นอาร์กิวเมนต์และส่งไปยังบานหน้าต่างเป้าหมายได้อย่างง่ายดาย

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