Come faccio a sapere il nome della sessione tmux corrente, eseguendo il comando tmux


34

Sto scrivendo una sceneggiatura. Voglio davvero saperlo. Spero che questo eseguibile possa dirmi questo.

io trovo

tmux rename <newname>

può rinominare la sessione corrente. Ma non riesco a trovare un comando per recuperare il proprio nome.

Risposte:


49

Con tmux 1.2 (e versioni successive), è possibile utilizzare l' -popzione di display-messageinviare un messaggio a stdout (invece di visualizzarlo su un client collegato):

tmux display-message -p '#S'

#Sè formattato come il nome della sessione (vedere la descrizione status-leftdell'opzione nella pagina man).


+1, molto meglio della mia risposta.
Chepner,

Apprezzo molto che tu abbia sottolineato che richiede tmux 1.2, che è esattamente la versione disponibile per l'aggiornamento online automatico di openSUSE 11.3.
Jimm Chen

Con tmux 1.8, questo restituisce il nome di una sessione allegata anche quando non lavoro in quella sessione.
Mihai Danila,

La risposta di Tim People qui sotto funziona con tmux 1.8 e successive, oltre a indirizzare i punti che solleva. Questa è la risposta migliore.
Alexandros,

8

Sono sorpreso che, dopo quasi 5 anni, nessuno abbia sottolineato che nessuna di queste risposte è adeguata. Mentre entrambi funzionano bene fintanto che l'attuale TTY è collegato all'unica sessione tmux sull'host, queste risposte sono entrambe piatte se:

  1. la sessione terminale corrente non fa parte di una sessione tmux, oppure
  2. ci sono più sessioni tmux collegate

Nel primo caso, entrambe le risposte qui riportano il nome della sessione allegata (indipendentemente dal fatto che l'attuale tty sia governato da quella sessione). In quest'ultimo caso, il risultato è probabilmente indeterminato o si tradurrà in risposte multiple.

La domanda corretta dovrebbe essere: "Qual è il nome della sessione tmux a cui è collegata la mia sessione terminale corrente?"

Poiché risponde a quella domanda, esegui:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Funziona indipendentemente dal numero di sessioni tmux (allegate o meno) e indipendentemente dal fatto che la sessione terminale corrente sia o meno parte di una sessione tmux.


1
Bella risposta. Invece di scorrere il nome di ogni sessione per elencare i suoi riquadri, è anche possibile utilizzare tmux list-panes -a -F '#{pane_tty} #{session_name}'per elencare i riquadri di ogni sessione. Non sono sicuro di quanto nuovo -a, quindi YMMV.
Brian Cline,

Sono tornato a questa domanda dopo aver utilizzato la risposta accettata e aver fallito secondo i problemi descritti qui. Per favore, vota questo. Se possibile, la risposta accettata dovrebbe essere modificata.
Alexandros,

1
Il metodo 1 funziona correttamente se combinato con il controllo TMUXdella variabile di ambiente prima dell'esecuzione tmux display-message -p '#S'per una tipica installazione desktop.
ZeroPhase

8

Risposta di tim- people estesa / corretta secondo il commento di don_crissti su Perché questo grep -vnon funziona come previsto? .

Comando "$ (tty)" nella risposta di tim-peoples

| grep "$ (tty)" |

non funzionerebbe in quel contesto come previsto. Valuta una stringa "non una tty".

Sostituirlo con una variabile risolve questo problema.

tty = $ (TTY)

...

| grep "$ tty" |

Inoltre, quando non esistono sessioni di tmux, il codice originale verrebbe prodotto

Messaggio di errore "nessun server in esecuzione su / tmp / tmux-1000 / default" .

Aggiungi 2>/dev/nulle il codice verrebbe eseguito senza stampare il messaggio di errore.

Il codice modificato è il seguente:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'

1
Qual è il miglioramento? Se è necessario, dovresti considerare di inviarlo come una modifica piuttosto che come una risposta. Per renderlo una buona risposta, probabilmente dovresti considerare di includere del testo più descrittivo.
Seth

1
@seth, volevo commentare ma stranamente non avevo abbastanza credito per farlo.
lato

Hai bisogno di 50 reputazione per commentare . Di solito non è una buona idea commentare con un codice complesso poiché mancano le interruzioni di riga e così via. La tua modifica l'ha resa una risposta abbastanza buona IMHO.
Seth,

Oh, ho capito adesso. Il problema "tty" è una cosa bash. Non uso quel guscio giocattolo: D
Tim Peoples

1
@TimPeoples Mentre potrebbe essere un problema di Bash. Bash è ancora lo standard per codificare gli script shell per la compatibilità sui terminali moderni. Certo, lo standard posix è l'ideale; ma, bash ha alcune caratteristiche condivise da tutti i terminali più avanzati. Colpendo Bash la maggior parte degli altri terminali principali dovrebbe funzionare. Ho appena eseguito il controllo della shell e ho rilevato un sacco di errori e problemi di formattazione. (usando principalmente la vecchia sintassi al posto dell'attuale sintassi più descrittiva)
ZeroPhase

4
  • La risposta di Chris Johnsen restituisce il nome di una sessione anche quando si esegue una query dall'esterno.
  • lato positivo e la risposta di Tim Peoples assumono a tty.

Invece, ho scoperto che questo funziona in modo accurato per me:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

Non è l'ideale, ma è possibile estrarre il nome della sessione allegata con awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

Il formato personalizzato è un po 'più semplice da analizzare rispetto al valore predefinito.

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.