मुझे 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), इस लाइन पर हम ए के बाद एवरीथिंग को काट देते हैं :, जो हमें सत्र के नाम के साथ छोड़ देता है। यह मेरे लिए एक सत्र के अंदर और बाहर काम करता है, जैसा कि विरोध किया गया tmux display-message -p "#S"

बेशक यह तभी काम करता है जब सत्र के नाम पर कोई :और नहीं (attached)है।

जैसा कि क्रिस जॉन्सन द्वारा टिप्पणी की गई है , यह जांचने का एक तरीका है कि कोई सत्र के अंदर है या नहीं, यह देखने के लिए कि क्या उसका पर्यावरण चर सेट है:

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

1
यहां तक ​​कि यह सही लगता है, मुझे मानना ​​होगा कि यह मेरे लिए काम नहीं करता था। मेरे पास दो कंसोल हैं, एक में मेरा tmuxसत्र है और दूसरे में मैं tmuxसत्र के बाहर हूं । जब मैं दोनों को कमांड में टाइप करता हूं tmux display-message -p "#S", तो समान परिणाम प्रिंट होता है और दोनों कमांड का रिटर्न वैल्यू एक समान होता है।
e271p314

मैं वही व्यवहार देखता हूं। एक काम के लिए मेरे अद्यतन जवाब को देखो।
pfnuesel

4
आप शायद TMUX पर्यावरण चर के लिए जाँच के साथ दूर हो सकते हैं (यह आम तौर पर एक सत्र के अंदर प्रक्रियाओं के लिए सेट किया जाता है, और सत्र के बाहर सेट नहीं किया जाता है - यह "मूर्ख प्रमाण" नहीं है, क्योंकि कुछ टीएमयूएक्स को सेट या परेशान कर सकता है और चीजों को भ्रमित कर सकता है,) लेकिन यह काफी विश्वसनीय होना चाहिए)। में ksh , बैश , zsh , वगैरह:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
क्रिस Johnsen

टिप्पणी के लिए धन्यवाद। यह वास्तव में अधिक सुंदर तरीका है और पर्याप्त रूप से मजबूत है, मुझे लगता है। मैंने अपने उत्तर में आपकी टिप्पणी जोड़ दी।
pfnuesel

क्या होगा अगर मैं एक ही समय में अलग-अलग नामों के साथ दो tmux सत्रों के अंदर हूं? क्या यह काम करता है?
Mihai Danila

0

यहाँ एक नज़र डालें , इस पोस्ट का उपयोग करते हुए मैंने समझा कि एक चीज़ जो tmuxग्राहकों को अलग करती है, वह है उनका, ttyलेकिन सत्र के नाम tmuxसर्वर संपत्ति हैं और जब हम tmuxग्राहक के अंदर या बाहर से सत्र के नाम को देखते हैं तो वही होता है । इसके बाद, हम उपयोग कर सकते हैं tmux info | headजो क्लाइंट और सर्वर के पीआईडी ​​को प्रदर्शित करता है।

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

यदि हम किसी tmuxक्लाइंट के अंदर चल रहे हैं तो निम्न कमांड रिटर्न वैल्यू 0 है tmux। यदि आप इसे किसी स्क्रिप्ट से चला रहे हैं, तो सुनिश्चित करें कि आप $ $ के बजाय ppid का उपयोग करते हैं क्योंकि tty शेल प्रक्रिया से जुड़ा है न कि जिस स्क्रिप्ट को आप चला रहे हैं।

एक आसान तरीका है, लेकिन यह जानने के लिए कम मजबूत है कि क्या हम tmuxTERM पर्यावरण चर को देखते हुए अंदर या बाहर ग्राहक हैं। ऐसा प्रतीत होता है कि क्लाइंट के बाहर यह 'xterm' कहता है, लेकिन इसके अंदर 'स्क्रीन' कहता है। हालांकि, मुझे पहला तरीका बहुत बेहतर लगता है।


0

यहाँ एक पर्ल स्क्रिप्ट है; इसे शेल स्क्रिप्ट या शेल स्क्रिप्ट फंक्शन बनाना पाठक के लिए एक अभ्यास है।

#!/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यदि आप इसे शेल स्क्रिप्ट या कुछ और में उपयोग करना चाहते हैं तो आप स्टेटमेंट्स को डिच कर सकते हैं और एक्जिट कोड का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.