Bir tmux oturumunun adını nasıl bilebilirim?


13

Son zamanlarda kullanmaya başladım tmux. Güzel buluyorum, ama hala bu uygulamayı anlamakta sorun yaşıyorum. Temel sorularımdan biri: tmuxOturum açtığım oturumun adı nedir (komut satırından) nasıl bilebilirim ? Eğer bazı tmuxoturumlara giriş yapmışsam , bana ismini söyleyecek. Ancak bir tmuxoturuma giriş yapmazsam , hiçbir şey veya bir tür hata yazdıracaktır.

Yanıtlar:


18

Oturumun adı değişkeninde saklanır #S, bir erişmek için şunları yapabilirsiniz:

tmux display-message -p "#S"

Eğer kullanmak istiyorsanız .tmux.conf, basitçe #S. -pSeçeneğin mesajı stdout'ta yazdıracağını unutmayın , aksi takdirde mesaj durum satırında görüntülenir.

Yukarıdaki komut bir oturum içinde çağrılırsa, oturumun adını döndürür. Herhangi bir oturumun dışında çağrılırsa, hala son çalışan oturumun adını döndürür. Bir oturumun içinde olup olmadığını kontrol etmek için bir komutu bulamadım , bu yüzden bu iş etrafında gelmek zorunda kaldı:

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

tmux list-sessionsekli ise tüm oturumları gösterir (attached), sonunda gösterilir. ile -nanahtar kelimeyi bulduğumuz yer dışındaki tüm çıktıları (seçenek ) bastırıyoruz (attached), bu satırda a'dan sonra herşeyi kesiyoruz :, bu da oturumun adını bize bırakıyor. Bunun aksine benim için bir oturumun içinde ve dışında çalışır tmux display-message -p "#S".

Tabii ki bu sadece oturum adına hayır :ve hayır varsa çalışır (attached).

Chris Johnsen tarafından yorumlandığı gibi , bir oturumu içinde olup olmadığını kontrol etmenin bir yolu , ortam değişkeninin ayarlanıp ayarlanmadığını görmektir:

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

1
Doğru görünse bile, benim için işe yaramadığını itiraf etmeliyim. İki konsolum var, birinde tmuxoturum var , diğerinde tmuxoturum dışındayım . Her ikisine de komut yazdığımda tmux display-message -p "#S", aynı sonuç yazdırılır ve her iki komutun dönüş değeri aynı olur.
e271p314

Aynı davranışı görüyorum. Bir çözüm bulmak için güncellenmiş cevabıma bakın.
pfnuesel

4
Muhtemelen TMUX ortam değişkenini kontrol etmekten kurtulabilirsiniz (normalde bir oturum içindeki işlemler için ayarlanır ve bir oturumun dışında ayarlanmaz - TMUX bir şey ayarlayabilir veya ayarını kaldırabilir ve işleri karıştırabilir, ancak oldukça güvenilir olmalıdır). In ksh , bash , zsh , vesaire:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen

Yorum için teşekkürler. Gerçekten daha zarif ve yeterince sağlam bir yol olduğunu düşünüyorum. Cevabıma yorumunuzu ekledim.
pfnuesel

Aynı anda farklı isimlerle iki tmux oturumu içindeysem ne olur? Bu çalışıyor mu?
Mihai Danila

0

Burada bir göz atın , bu yazıyı kullanarak tmuxistemcileri ayıran tek şey onların ttyama oturum adları tmuxsunucu özelliği ve biz bir tmuxistemci içinde veya dışında oturum adına bakıldığında aynı olduğunu anladım . Daha tmux info | headsonra, istemcinin pid ve tty'sini ve sunucunun pid'ini görüntüleyen kullanabiliriz .

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

Aşağıdaki komut dönüş değeri bir tmuxistemcinin içindeyse 0 veya tmuxistemcinin dışında çalışıyorsak sıfırdan farklıdır. Bir komut dosyasından çalıştırıyorsanız, tty çalıştırdığınız komut dosyasıyla değil kabuk işlemiyle ilişkili olduğundan $$ yerine ppid kullandığınızdan emin olun.

tmuxİstemcinin içinde mi yoksa dışında mı olduğumuzu bilmenin kolay bir yolu ama daha az sağlam olması TERM ortam değişkenine bakmaktır. Görünüşe göre istemcinin dışında 'xterm' ama içinde 'ekran' yazıyor. Ancak, ilk yolu daha iyi buluyorum.


0

İşte bir perl betiği; kabuk komut dosyası veya kabuk komut dosyası işlevi yapmak okuyucuya bırakılan bir alıştırmadır.

#!/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;
}

Bu, TMUX oturumunda aşağıdaki çıktıyı üretir:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

TMUX oturumu dışında aşağıdakiler üretilir:

<~> $ tmuxsessionname
Not in a TMUX session

printBir kabuk betiğinde veya başka bir şeyde kullanmak istiyorsanız , ifadeleri silebilir ve sadece çıkış kodunu kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.