Bagaimana saya tahu nama sesi tmux?

13

Baru-baru ini, saya mulai menggunakan tmux. Saya merasa baik, tetapi saya masih mengalami masalah dalam memahami aplikasi ini. Salah satu pertanyaan dasar yang saya miliki adalah: Bagaimana saya tahu (dari baris perintah) apa nama tmuxsesi yang saya masuki? Jika saya masuk ke beberapa tmuxsesi, itu akan memberi tahu saya namanya. Tetapi jika saya tidak masuk ke suatu tmuxsesi, itu akan mencetak apa-apa atau semacam kesalahan.

e271p314
sumber

Jawaban:

17

Nama sesi disimpan dalam variabel #S , untuk mengaksesnya di , Anda bisa melakukannya

tmux display-message -p "#S"

Jika Anda ingin menggunakannya .tmux.conf, sederhana saja #S. Perhatikan bahwa -popsi akan mencetak pesan pada stdout, jika tidak pesan ditampilkan di baris status .

Jika perintah di atas disebut di dalam sesi, itu mengembalikan nama sesi. Jika dipanggil di luar sesi apa pun, masih mengembalikan nama sesi yang masih berjalan terakhir. Saya tidak dapat menemukan perintah untuk memeriksa, apakah ada di dalam sesi atau tidak, jadi saya harus membuat pekerjaan ini:

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

tmux list-sessionsmenunjukkan semua sesi, jika ada yang terpasang, itu menunjukkan (attached)di akhir. Dengan kami menekan semua output (opsi -n) kecuali di mana kami menemukan kata kunci (attached), pada baris ini kami memotong setiap setelah :, yang membuat kami dengan nama sesi. Ini berfungsi untuk saya di dalam dan di luar sesi, bukan tmux display-message -p "#S".

Tentu saja ini hanya berfungsi jika tidak ada :dan tidak ada (attached)dalam nama sesi.

Seperti dikomentari oleh Chris Johnsen , cara untuk memeriksa apakah ada di dalam sesi adalah untuk melihat apakah variabel lingkungannya diatur:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pnuesel
sumber
1
Walaupun kelihatannya benar, saya harus mengakui itu tidak bekerja untuk saya. Saya memiliki dua konsol, dalam satu saya memiliki tmuxsesi dan yang lain saya di luar tmuxsesi. Ketika saya mengetikkan keduanya perintah tmux display-message -p "#S", hasil yang sama dicetak dan nilai kembali dari kedua perintah itu sama.
e271p314
Saya melihat perilaku yang sama. Lihatlah jawaban saya yang diperbarui untuk mencari solusi.
pfnuesel
4
Anda mungkin bisa lolos dengan memeriksa variabel lingkungan TMUX (biasanya diatur untuk proses di dalam sesi, dan tidak ditetapkan di luar sesi — ini bukan "bukti bodoh", karena sesuatu mungkin mengatur atau membatalkan set TMUX dan membingungkan hal-hal, tetapi harus cukup andal). Dalam ksh , bash , zsh , dan lain-lain:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Terima kasih atas komentarnya. Itu memang cara yang lebih elegan dan cukup kuat, kurasa. Saya menambahkan komentar Anda dalam jawaban saya.
pfnuesel
Bagaimana jika saya berada di dalam dua sesi tmux dengan nama yang berbeda secara bersamaan? Apakah ini berhasil?
Mihai Danila
0

Lihat di sini , menggunakan posting ini saya mengerti bahwa satu hal yang membedakan tmuxklien adalah nama mereka ttytetapi sesi adalah tmuxproperti server dan sama ketika kita melihat nama sesi dari dalam atau luar tmuxklien. Selanjutnya, kita dapat menggunakan tmux info | headyang menampilkan pid dan tty dari klien dan pid dari server.

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

Nilai pengembalian perintah berikut adalah 0 jika kita berada di dalam tmuxklien atau bukan nol jika kita menjalankan di luar tmuxklien. Jika Anda menjalankannya dari skrip, pastikan Anda menggunakan ppid bukan $$ karena tty dikaitkan dengan proses shell bukan skrip yang Anda jalankan.

Satu cara mudah tetapi kurang kuat untuk mengetahui apakah kita berada di dalam atau di luar tmuxklien adalah dengan melihat variabel lingkungan TERM. Tampaknya di luar klien tertulis 'xterm' tetapi di dalamnya tertulis 'layar'. Namun, saya menemukan cara pertama jauh lebih baik.

e271p314
sumber
0

Berikut skrip perl; menjadikannya skrip shell atau fungsi skrip shell adalah latihan yang tersisa untuk pembaca.

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

Ini menghasilkan output berikut dalam sesi TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Di luar sesi TMUX akan menghasilkan yang berikut:

<~> $ tmuxsessionname
Not in a TMUX session

Anda dapat membuang printpernyataan dan hanya menggunakan kode keluar jika Anda ingin menggunakan ini dalam skrip shell atau sesuatu.

Joe Casadonte
sumber