Tmux - รับบานหน้าต่าง # ของแต่ละบานหน้าต่างจากสคริปต์?


12

มีวิธีการหาดัชนีบานหน้าต่างของบานหน้าต่างเฉพาะใน Tmux หรือไม่

ฉันรู้ว่าฉันสามารถทำสิ่งที่ชอบ:

tmux display-message -p  "#{pane_index}"  

แต่ใช้งานได้เฉพาะในบานหน้าต่างที่ใช้งานอยู่ ฉันต้องการให้มันทำงานกับทุกบานที่มันทำงานอยู่ปกติแล้วมันยากที่จะเรียกใช้สคริปต์ในบานหน้าต่างที่ไม่ใช่บานหน้าต่างที่ใช้งานอยู่ แต่คุณสามารถทำได้ถ้าคุณใช้:set-window-option synchronize-panesเพื่อซิงค์อินพุตระหว่างบานหน้าต่างทั้งหมด

ฉันจะใช้สิ่งนี้ได้อย่างไร

ในงานของฉันฉันต้องเชื่อมต่อกับเซิร์ฟเวอร์ที่เหมือนกันหลายตัวใน load balancer พร้อมกันซึ่งฉันทำกับบานหน้าต่าง Tmux ปกติฉันจะเปิดฟีเจอร์การซิงโครไนซ์บานหน้าต่างเพื่อให้ฉันมีสิ่งที่ฉันพิมพ์ส่งไปยังแต่ละบานหน้าต่างในเวลาเดียวกัน มันใช้งานได้ดี

สิ่งที่ฉันพบคือฉันต้องการเชื่อมต่อกับเซิร์ฟเวอร์และทำสิ่งที่ไม่ซ้ำกับแต่ละบานหน้าต่างในบางครั้งโดยใช้ "ดัชนีบานหน้าต่าง" เดียวกันทุกครั้ง ตัวอย่างเช่นฉันจะใช้คำสั่งดังนี้:

ssh NODE_$(get_pane_number)

ซึ่งเมื่อทำข้อมูลให้ตรงกันและทำงานในแต่ละบานหน้าต่างจะเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างที่มี 4 บานหน้าต่าง:

ssh NODE_0 ในบานหน้าต่าง 0

ssh NODE_1 ในบานหน้าต่าง 1

ssh NODE_2 ในบานหน้าต่าง 2

ssh NODE_3 ในช่อง 3

แน่นอนฉันสามารถสคริปต์นี้ แต่จะทำงานได้ดีก่อนที่ฉันจะเริ่มซิงโครไนซ์อินพุต มีบางครั้งที่ฉันต้องการทำสิ่งนี้หลังจากที่ฉันเริ่มซิงโครไนซ์อินพุตเช่นกัน

คำตอบ:


12

tmux (ตั้งแต่ v1.5) จัดเตรียม TMUX_PANE ในสภาวะแวดล้อมของกระบวนการที่เรียกทำงานสำหรับบานหน้าต่าง แต่ละบานหน้าต่างใหม่จะได้รับค่าที่ไม่ซ้ำกันของเซิร์ฟเวอร์ ดังนั้นสมมติว่า TMUX_PANE พร้อมใช้งานในสภาพแวดล้อมของคุณแล้วสิ่งนี้ควรทำในสิ่งที่ฉันคิดว่าคุณต้องการ:

tmux display -pt "${TMUX_PANE:?}" '#{pane_index}'

${…:?}ไวยากรณ์ในบอร์นเหมือนเปลือกป้องกันการขยายตัวของที่หายไปหรือพารามิเตอร์ที่ว่างเปล่า ในกรณีนี้การขยายที่ว่างเปล่าจะกลับไปเป็นค่าเริ่มต้นของการใช้“ บานหน้าต่างที่ใช้งานอยู่ในปัจจุบัน” ซึ่งมักจะ - แต่ไม่เสมอไป - เหมือนกับ“ บานหน้าต่างนี้” (อาจแตกต่างกันไปหากคำสั่ง tty ไม่ใช่tmuxนั้นเริ่มต้นเช่นเนื่องจากการใช้สคริปต์หรือคาดหวังและอื่น ๆ )


หวาน! ที่ทำมันทั้งหมด ... ชื่นชมมาก!
Brad Parks

ไวยากรณ์ "$ {TMUX_PANE :?}" ไม่สามารถใช้งานกับเชลล์ปลาได้
CodyChan

2

คุณสามารถรับดัชนีของบานหน้าต่างทั้งหมดรวมถึงข้อมูลอื่น ๆ อีกมากมายเกี่ยวกับบานหน้าต่างด้วย

tmux list-panes -a

ดูtmux(1)รูปแบบเพื่อรับรายการข้อมูลที่คุณสามารถรับและทำงานด้วย


1
ขอบคุณสำหรับข้อเสนอแนะ - แต่นี่ไม่ได้บอกฉันว่าบานหน้าต่างไหนเป็นแบบไหน - เพียงแค่มีบานหน้าต่าง 0-3 ในหน้าต่างซึ่งฉันสามารถหาได้แล้ว ฉันต้องการที่จะสามารถเขียนสคริปต์ทุบตีที่เรียกget_pane_numberว่าจริง ๆ แล้วส่งกลับ # ขวาโดยไม่ต้องบานหน้าต่างที่ใช้งานอยู่
แบรดพาร์ค

2

เมื่อสร้างโซลูชันทั้งสองที่เสนอขึ้นฉันพบว่าฟังก์ชันนี้ใช้งานได้สำหรับฉัน:

I=$(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}')

หรือสิ่งเดียวกันเริ่มต้นด้วยดัชนี = 1

I=$(($(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}') + 1))

มันไม่ได้สวยที่สุด แต่มันใช้งานได้และฉันสามารถวางลงในของฉัน.bashrcและใช้$Iเมื่อใดก็ตามที่ฉันต้องการ

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