Come faccio a sapere il nome di una sessione di tmux?


13

Di recente, ho iniziato a utilizzare tmux. Lo trovo carino, ma ho ancora problemi a capire questa applicazione. Una delle domande di base che ho è: come faccio a sapere (dalla riga di comando) qual è il nome della tmuxsessione a cui ho effettuato l'accesso? Se accedo a qualche tmuxsessione, mi dirà il suo nome. Ma se non sono registrato a una tmuxsessione, verrà stampato nulla o una sorta di errore.

Risposte:


18

Il nome della sessione è memorizzato nella variabile #S , per accedervi in ​​un , puoi farlo

tmux display-message -p "#S"

Se vuoi usarlo .tmux.conf, è semplicemente #S. Si noti che l' -popzione stamperà il messaggio su stdout, altrimenti il ​​messaggio verrà visualizzato nella stato di .

Se il comando precedente viene chiamato all'interno di una sessione, restituisce il nome della sessione. Se viene chiamato al di fuori di qualsiasi sessione, restituisce comunque il nome dell'ultima sessione ancora in esecuzione. Non sono riuscito a trovare un comando per verificare, se uno è all'interno di una sessione o meno, quindi ho dovuto escogitare questo lavoro in giro:

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

tmux list-sessionsmostra tutte le sessioni, se ne è collegata una, mostra (attached)alla fine. Con sopprimiamo tutto l'output (opzione -n) tranne dove troviamo la parola chiave (attached), in questa riga eliminiamo tutto ciò che segue a :, che ci lascia con il nome della sessione. Questo funziona per me dentro e fuori una sessione, al contrario di tmux display-message -p "#S".

Naturalmente questo funziona solo se non c'è :e no (attached)nel nome della sessione.

Come commentato da Chris Johnsen , un modo per verificare se uno è all'interno di una sessione di è vedere se la sua variabile di ambiente è impostata:

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

1
Anche se sembra corretto, devo ammettere che non ha funzionato per me. Ho due console, in una ho la tmuxsessione e nell'altra sono fuori dalla tmuxsessione. Quando digito entrambi i comandi tmux display-message -p "#S", viene stampato lo stesso risultato e il valore restituito di entrambi i comandi è lo stesso.
e271p314,

Vedo lo stesso comportamento. Guarda la mia risposta aggiornata per aggirare.
pfnuesel,

4
Probabilmente puoi semplicemente scappare controllando la variabile d'ambiente TMUX (normalmente è impostata per i processi all'interno di una sessione e non impostata al di fuori di una sessione; ciò non è "infallibile", dal momento che qualcosa potrebbe impostare o disinserire TMUX e confondere le cose, ma dovrebbe essere abbastanza affidabile). In ksh , bash , zsh , eccetera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen,

Grazie per il commento. Questo è davvero un modo più elegante e abbastanza robusto, credo. Ho aggiunto il tuo commento nella mia risposta.
pfnuesel,

E se fossi dentro due sessioni di tmux con nomi diversi contemporaneamente? funziona?
Mihai Danila,

0

Dai un'occhiata qui , usando questo post ho capito che l'unica cosa che distingue i tmuxclient è la loro ttyma i nomi delle sessioni sono tmuxproprietà del server ed è lo stesso quando guardiamo il nome della sessione all'interno o all'esterno di un tmuxclient. Successivamente, potremo utilizzare tmux info | headquale visualizza il pid e il tty del client e il pid del server.

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

Il seguente valore restituito dal comando è 0 se siamo all'interno di un tmuxclient o diversi da zero se siamo in esecuzione all'esterno di un tmuxclient. Se lo stai eseguendo da uno script, assicurati di usare ppid invece di $$ poiché tty è associato al processo di shell e non allo script che stai eseguendo.

Un modo semplice ma meno robusto per sapere se siamo dentro o fuori tmuxclient è guardando la variabile d'ambiente TERM. Sembra che al di fuori del client si dice "xterm" ma al suo interno si dice "schermo". Tuttavia, trovo il primo modo molto migliore.


0

Ecco uno script perl; renderlo uno script di shell o una funzione di script di shell è un esercizio lasciato al lettore.

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

Ciò produce il seguente output in una sessione TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Al di fuori di una sessione TMUX produrrebbe quanto segue:

<~> $ tmuxsessionname
Not in a TMUX session

Puoi abbandonare le printistruzioni e semplicemente usare il codice di uscita se vuoi usarlo in uno script di shell o qualcosa del genere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.