ฉันกำลังเขียนสคริปต์ ฉันอยากรู้เรื่องนี้จริงๆ ฉันหวังว่าปฏิบัติการ tmux สามารถบอกฉันนี้
ฉันหา
tmux rename <newname>
สามารถเปลี่ยนชื่อเซสชันปัจจุบัน แต่ฉันไม่สามารถค้นหาคำสั่งเพื่อดึงชื่อของตัวเองได้
ฉันกำลังเขียนสคริปต์ ฉันอยากรู้เรื่องนี้จริงๆ ฉันหวังว่าปฏิบัติการ tmux สามารถบอกฉันนี้
ฉันหา
tmux rename <newname>
สามารถเปลี่ยนชื่อเซสชันปัจจุบัน แต่ฉันไม่สามารถค้นหาคำสั่งเพื่อดึงชื่อของตัวเองได้
คำตอบ:
ด้วยtmux 1.2 (และใหม่กว่า) คุณสามารถใช้-p
ตัวเลือกในdisplay-message
การส่งข้อความไปยัง stdout (แทนที่จะแสดงไปยังไคลเอนต์ที่เชื่อมต่อ):
tmux display-message -p '#S'
#S
ถูกจัดรูปแบบเป็นชื่อเซสชัน (ดูคำอธิบายของstatus-left
ตัวเลือกในหน้า man)
ฉันประหลาดใจที่หลังจากเกือบ 5 ปีที่ผ่านมาไม่มีใครชี้ให้เห็นว่าคำตอบเหล่านี้ไม่เพียงพอ ในขณะที่ทั้งสองทำงานได้ดีตราบใดที่ TTY ปัจจุบันเชื่อมต่อกับเซสชัน 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
tmux list-panes -a -F '#{pane_tty} #{session_name}'
เพื่อแสดงบานหน้าต่างของทุกเซสชัน ไม่แน่ใจว่าใหม่แค่ไหน-a
ดังนั้น YMMV
TMUX
ตัวแปรสภาพแวดล้อมก่อนที่จะเรียกใช้tmux display-message -p '#S'
การตั้งค่าเดสก์ท็อปทั่วไป
คำตอบของผู้ใช้ 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}'
tty
ด้านสว่างและทิมคำตอบประชาชนถือว่าแต่ฉันพบว่าสิ่งนี้ทำงานได้อย่างถูกต้องสำหรับฉัน:
if [[ -n "$TMUX_PANE" ]]; then
session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
ไม่เหมาะ แต่คุณสามารถแยกชื่อเซสชันที่แนบมาด้วยawk
:
tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'
รูปแบบที่กำหนดเองง่ายกว่าในการแยกวิเคราะห์กว่าค่าเริ่มต้น