ฉันจะรู้ชื่อเซสชัน tmux ปัจจุบันได้อย่างไรโดยใช้คำสั่ง tmux


34

ฉันกำลังเขียนสคริปต์ ฉันอยากรู้เรื่องนี้จริงๆ ฉันหวังว่าปฏิบัติการ tmux สามารถบอกฉันนี้

ฉันหา

tmux rename <newname>

สามารถเปลี่ยนชื่อเซสชันปัจจุบัน แต่ฉันไม่สามารถค้นหาคำสั่งเพื่อดึงชื่อของตัวเองได้

คำตอบ:


49

ด้วยtmux 1.2 (และใหม่กว่า) คุณสามารถใช้-pตัวเลือกในdisplay-messageการส่งข้อความไปยัง stdout (แทนที่จะแสดงไปยังไคลเอนต์ที่เชื่อมต่อ):

tmux display-message -p '#S'

#Sถูกจัดรูปแบบเป็นชื่อเซสชัน (ดูคำอธิบายของstatus-leftตัวเลือกในหน้า man)


+1 ดีกว่าคำตอบของฉัน
chepner

ฉันซาบซึ้งมากที่คุณชี้ให้เห็นว่าต้องใช้ tmux 1.2 ซึ่งเป็นรุ่นที่มีให้สำหรับ openSUSE 11.3 การอัปเดตออนไลน์อัตโนมัติ
Jimm Chen

ด้วย tmux 1.8 นี่จะส่งคืนชื่อของเซสชันที่แนบมาแม้ว่าฉันจะไม่ได้ทำงานในเซสชันนั้นก็ตาม
หมดเวลา Danila

คำตอบของ Tim ประชาชนทำงานกับ tmux 1.8 ขึ้นไปเช่นเดียวกับที่อยู่จุดที่เขายก นั่นคือคำตอบที่ดีกว่า
Alexandros

8

ฉันประหลาดใจที่หลังจากเกือบ 5 ปีที่ผ่านมาไม่มีใครชี้ให้เห็นว่าคำตอบเหล่านี้ไม่เพียงพอ ในขณะที่ทั้งสองทำงานได้ดีตราบใดที่ TTY ปัจจุบันเชื่อมต่อกับเซสชัน tmux เดียวบนโฮสต์คำตอบทั้งคู่นี้จะไม่ทำงานหาก:

  1. เทอร์มินัลเซสชันปัจจุบันไม่ได้เป็นส่วนหนึ่งของเซสชัน tmux หรือ
  2. มีหลายเซสชัน tmux ที่แนบมา

ในกรณีก่อนหน้าทั้งสองคำตอบที่นี่รายงานชื่อเซสชั่นที่แนบมากลับมา (ไม่ว่า tty ปัจจุบันจะถูกควบคุมโดยเซสชันนั้นหรือไม่) ในกรณีหลังผลลัพธ์อาจไม่แน่ชัดหรือมีหลายคำตอบ

คำถามที่เหมาะสมควรเป็น "ชื่อของเซสชัน tmux ที่เซสชันเทอร์มินัลปัจจุบันของฉันแนบอยู่คืออะไร"

เพราะเขาตอบว่าคำถามดำเนินการ:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

สิ่งนี้ทำงานได้โดยไม่คำนึงถึงจำนวนของเซสชัน tmux (เชื่อมต่อหรือเป็นอย่างอื่น) และไม่ว่าเซสชันเทอร์มินัลปัจจุบันจะเป็นหรือไม่ได้เป็นส่วนหนึ่งของเซสชัน tmux


1
คำตอบที่ดี แทนที่จะวนลูปผ่านแต่ละชื่อเซสชันเพื่อแสดงบานหน้าต่างของมันคุณยังสามารถใช้tmux list-panes -a -F '#{pane_tty} #{session_name}'เพื่อแสดงบานหน้าต่างของทุกเซสชัน ไม่แน่ใจว่าใหม่แค่ไหน-aดังนั้น YMMV
Brian Cline

กลับมาที่คำถามนี้หลังจากใช้คำตอบที่ยอมรับและล้มเหลวตามปัญหาที่อธิบายไว้ที่นี่ โปรดโหวตสิ่งนี้ หากเป็นไปได้ควรเปลี่ยนคำตอบที่ยอมรับได้
Alexandros

1
วิธีที่ 1 ทำงานได้ดีถ้ารวมกับการตรวจสอบTMUXตัวแปรสภาพแวดล้อมก่อนที่จะเรียกใช้tmux display-message -p '#S'การตั้งค่าเดสก์ท็อปทั่วไป
ZeroPhase

8

คำตอบของผู้ใช้ Tim- peแบบขยาย / แก้ไข ตามความคิดเห็นของ don_crissti เกี่ยวกับเหตุใดจึงgrep -vไม่ทำงานตามที่คาดไว้ .

คำสั่ง "$ (tty)" ในคำตอบของ tim-peoples

| grep "$ (tty)" |

จะไม่ทำงานในบริบทนั้นตามที่คาดไว้ มันประเมินเป็นสตริง 'ไม่ใช่ tty'

การแทนที่ด้วยตัวแปรจะช่วยแก้ปัญหานี้ได้

TTY = $ (TTY)

...

| grep "$ tty" |

นอกจากนี้เมื่อไม่มีเซสชัน tmux อยู่รหัสต้นฉบับจะสร้างขึ้น

ข้อความแสดงข้อผิดพลาด"ไม่มีเซิร์ฟเวอร์ที่ทำงานบน / tmp / tmux-1000 / default"

เพิ่ม2>/dev/nullและรหัสจะทำงานโดยไม่ต้องพิมพ์ข้อความผิดพลาด

รหัสที่แก้ไขจะอ่านว่า:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'

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

1
@seth ฉันต้องการแสดงความคิดเห็น แต่ก็ไม่มีเครดิตเพียงพอที่จะทำเช่นนั้น
ด้านสว่าง

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

โอ้ฉันเข้าใจแล้ว ปัญหา "tty" เป็นสิ่งที่น่ากลัว ฉันไม่ได้ใช้เปลือกของเล่นนั่น: D
Tim Peoples

1
@TimPeoples แม้ว่ามันอาจจะเป็นปัญหา Bash Bash ยังคงเป็นมาตรฐานในการเขียนโค้ดสคริปต์เชลล์เพื่อความเข้ากันได้กับเทอร์มินัลสมัยใหม่ แน่นอนว่ามาตรฐาน posix นั้นเหมาะสมที่สุด แต่ทุบตีมีคุณสมบัติบางอย่างที่ใช้ร่วมกันทั้งหมดขั้วขั้นสูง โดยการกดปุ่ม Bash เทอร์มินัลหลักอื่น ๆ ส่วนใหญ่ควรจะทำงานได้ ฉันเพียงแค่เรียกใช้การตรวจสอบเชลล์และจับข้อผิดพลาดและปัญหาการจัดรูปแบบจำนวนมาก (ส่วนใหญ่ใช้ไวยากรณ์เก่าแทนไวยากรณ์ที่อธิบายเพิ่มเติมปัจจุบัน)
ZeroPhase

4
  • คำตอบของ Chris Johnsen ส่งคืนชื่อเซสชันแม้ว่าจะทำการสอบถามจากภายนอก
  • ttyด้านสว่างและทิมคำตอบประชาชนถือว่า

แต่ฉันพบว่าสิ่งนี้ทำงานได้อย่างถูกต้องสำหรับฉัน:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

ไม่เหมาะ แต่คุณสามารถแยกชื่อเซสชันที่แนบมาด้วยawk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

รูปแบบที่กำหนดเองง่ายกว่าในการแยกวิเคราะห์กว่าค่าเริ่มต้น

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