ฉันจะรู้ชื่อของเซสชัน tmux ได้อย่างไร?


13

เมื่อเร็ว ๆ tmuxนี้ผมเริ่มใช้ ฉันคิดว่ามันดี แต่ฉันยังมีปัญหาในการทำความเข้าใจแอปพลิเคชันนี้ หนึ่งในคำถามพื้นฐานที่ฉันมีคือ: ฉันจะรู้ได้อย่างไร (จากบรรทัดคำสั่ง) ชื่อของtmuxเซสชันที่ฉันเข้าสู่ระบบคืออะไร? หากฉันเข้าสู่tmuxเซสชันบางรายการจะบอกชื่อของฉัน แต่ถ้าฉันไม่ได้เข้าสู่tmuxเซสชั่นก็จะพิมพ์อะไรหรือข้อผิดพลาดบางอย่าง

คำตอบ:


18

ชื่อของเซสชันถูกเก็บไว้ในตัวแปร#Sเพื่อเข้าถึงในคุณสามารถทำได้

tmux display-message -p "#S"

หากคุณต้องการที่จะใช้ในก็เพียง.tmux.conf #Sโปรดทราบว่า-pตัวเลือกจะพิมพ์ข้อความใน stdout มิฉะนั้นข้อความจะปรากฏในบรรทัดสถานะ

ถ้าคำสั่งดังกล่าวเรียกว่าภายในเซสชั่นก็จะส่งกลับชื่อของเซสชั่น หากถูกเรียกนอกเซสชันใด ๆ ก็ยังคงส่งคืนชื่อของเซสชันที่ยังทำงานล่าสุดอยู่ ฉันไม่พบคำสั่งเพื่อตรวจสอบหากมีในเซสชั่นหรือไม่ดังนั้นฉันจึงต้องมากับงานนี้:

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessionsแสดงทุกเซสชันหากมีการเชื่อมต่อจะแสดง(attached)ที่ส่วนท้าย ด้วยเราจะระงับเอาต์พุตทั้งหมด (ตัวเลือก-n) ยกเว้นตำแหน่งที่เราค้นหาคำสำคัญ(attached)ที่บรรทัดนี้เราตัดคำว่า everyhing หลังจาก a :ซึ่งทำให้เรามีชื่อของเซสชัน tmux display-message -p "#S"งานนี้สำหรับฉันภายในและภายนอกเซสชั่นเมื่อเทียบกับ

หลักสูตรนี้ใช้ได้เฉพาะในกรณีที่ไม่มี:และไม่มี(attached)ในชื่อของเซสชัน

ตามที่คอมเมนต์โดยChris Johnsenวิธีการตรวจสอบว่ามีอยู่ในเซสชั่นคือการดูว่าตัวแปรสภาพแวดล้อมของการตั้งค่า:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"

1
แม้ว่ามันจะดูถูกต้อง แต่ฉันก็ต้องยอมรับว่ามันไม่ได้ผลสำหรับฉัน ฉันมีสองคอนโซลในหนึ่งฉันมีtmuxเซสชั่นและอื่น ๆ ที่ฉันอยู่นอกtmuxเซสชั่น เมื่อฉันพิมพ์ทั้งสองคำสั่งtmux display-message -p "#S"ผลลัพธ์เดียวกันจะถูกพิมพ์และค่าส่งคืนของทั้งสองคำสั่งจะเหมือนกัน
e271p314

ฉันเห็นพฤติกรรมเดียวกัน ดูคำตอบที่อัปเดตของฉันเพื่อหาวิธีแก้ไข
pfnuesel

4
คุณอาจเพิ่งจะออกไปพร้อมกับตรวจสอบตัวแปรสภาพแวดล้อม TMUX (โดยปกติแล้วจะถูกตั้งค่าสำหรับกระบวนการภายในเซสชันและไม่ได้ตั้งค่าไว้นอกเซสชัน - นี่ไม่ใช่ "หลักฐานพิสูจน์โง่" เนื่องจากบางสิ่งอาจตั้งค่าหรือตั้งค่า TMUX และสร้างความสับสน แต่ควรน่าเชื่อถือพอสมควร) ในksh , bash , zsh , และ cetera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen

ขอบคุณสำหรับความคิดเห็น นั่นเป็นวิธีที่สง่างามกว่าและแข็งแกร่งพอที่ฉันคิด ฉันเพิ่มความคิดเห็นของคุณในคำตอบของฉัน
pfnuesel

จะเป็นอย่างไรถ้าฉันอยู่ในสองเซสชัน tmux ที่มีชื่อต่างกันในเวลาเดียวกัน มันใช้ได้ไหม?
Mihai Danila

0

ดูที่นี่โดยใช้โพสต์นี้ฉันเข้าใจว่าสิ่งหนึ่งที่แยกความแตกต่างtmuxลูกค้าคือttyชื่อเซสชัน แต่เป็นtmuxคุณสมบัติเซิร์ฟเวอร์และจะเหมือนกันเมื่อเราดูชื่อเซสชันจากภายในหรือภายนอกtmuxลูกค้า ต่อไปเราอาจใช้tmux info | headซึ่งแสดง pid และ tty ของไคลเอ็นต์และ pid ของเซิร์ฟเวอร์

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

ค่าส่งคืนคำสั่งต่อไปนี้คือ 0 ถ้าเราอยู่ในtmuxไคลเอนต์หรือไม่เป็นศูนย์ถ้าเรากำลังเรียกใช้นอกtmuxไคลเอนต์ หากคุณกำลังเรียกใช้จากสคริปต์ตรวจสอบให้แน่ใจว่าคุณใช้ ppid แทน $$ เนื่องจาก tty เชื่อมโยงกับกระบวนการเชลล์ไม่ใช่สคริปต์ที่คุณกำลังทำงาน

วิธีง่ายๆวิธีหนึ่ง แต่มีประสิทธิภาพน้อยกว่าที่จะทราบว่าเราอยู่ภายในหรือภายนอกtmuxลูกค้าโดยดูที่ตัวแปรสภาพแวดล้อม TERM ปรากฏว่าลูกค้าภายนอกระบุว่า 'xterm' แต่ภายในนั้นระบุว่า 'หน้าจอ' อย่างไรก็ตามฉันพบวิธีแรกดีกว่ามาก


0

นี่คือสคริปต์ Perl; การทำให้เชลล์สคริปต์หรือฟังก์ชันเชลล์สคริปต์เป็นแบบฝึกหัดที่เหลือไว้สำหรับผู้อ่าน

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

สิ่งนี้สร้างเอาต์พุตต่อไปนี้ในเซสชัน TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

นอกเหนือจากเซสชัน TMUX มันจะสร้างสิ่งต่อไปนี้:

<~> $ tmuxsessionname
Not in a TMUX session

คุณสามารถทิ้งprintงบและใช้รหัสทางออกหากคุณต้องการใช้สิ่งนี้ในเชลล์สคริปต์หรืออะไรบางอย่าง

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