¿Cómo sé el nombre actual de la sesión tmux, ejecutando el comando tmux?

34

Estoy escribiendo un guion. Realmente quiero saber esto. Espero que el ejecutable de tmux pueda decirme esto.

Encuentro

tmux rename <newname>

puede cambiar el nombre de la sesión actual. Pero no puedo encontrar un comando para buscar su propio nombre.

Jimm Chen
fuente

Respuestas:

49

Con tmux 1.2 (y posterior), puede usar la -popción de display-messageenviar un mensaje a stdout (en lugar de mostrarlo a un cliente adjunto):

tmux display-message -p '#S'

#Stiene el formato del nombre de la sesión (consulte la descripción de la status-leftopción en la página del manual).

Chris Johnsen
fuente
+1, mucho mejor que mi respuesta.
chepner
Realmente aprecio que señales que requiere tmux 1.2, que es exactamente la versión disponible para la actualización automática en línea de openSUSE 11.3.
Jimm Chen
Con tmux 1.8, esto devuelve el nombre de una sesión adjunta incluso cuando no estoy trabajando en esa sesión.
Mihai Danila
La respuesta de Tim People a continuación funciona con tmux 1.8 y versiones posteriores, y también aborda los puntos que plantea. Esa es la mejor respuesta.
Alexandros
8

Me sorprende que, después de casi 5 años, nadie haya señalado que ninguna de estas respuestas sea adecuada. Si bien ambos funcionan bien siempre y cuando el TTY actual esté conectado a la única sesión tmux en el host, estas respuestas no funcionan si:

  1. la sesión de terminal actual no es parte de una sesión tmux, o
  2. hay varias sesiones de tmux adjuntas

En el primer caso, ambas respuestas aquí informan el nombre de la sesión adjunta (independientemente de si el tty actual se rige por esa sesión). En el último caso, el resultado es probablemente indeterminado o dará como resultado múltiples respuestas.

La pregunta correcta debería ser: "¿Cuál es el nombre de la sesión tmux a la que está conectada mi sesión de terminal actual?"

Para que él responda a esa pregunta, ejecute:

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}'

Esto funciona independientemente del número de sesiones de tmux (adjuntas o no) e independientemente de si la sesión de terminal actual es o no parte de una sesión de tmux.

Pueblos de Tim
fuente
1
Gran respuesta. En lugar de recorrer cada nombre de sesión para enumerar sus paneles, también puede usar tmux list-panes -a -F '#{pane_tty} #{session_name}'para enumerar los paneles de cada sesión. No estoy seguro de qué tan nuevo -aes, así que YMMV.
Brian Cline
Volví a esta pregunta después de usar la respuesta aceptada y fallar según los problemas descritos aquí. Por favor vota esto. Si es posible, la respuesta aceptada debe cambiarse.
Alexandros
1
El método 1 funciona bien si se combina con TMUXla variable de entorno de comprobación antes de ejecutar tmux display-message -p '#S'una configuración de escritorio típica.
ZeroPhase
8

Extendido / corregido respuesta de Tim-pueblos de acuerdo con el comentario de don_crissti en ¿Por qué esta grep -vno está funcionando como se esperaba? .

Comando "$ (tty)" en la respuesta de tim-people

El | grep "$ (tty)" |

no funcionaría en ese contexto como se esperaba. Se evalúa como una cadena 'no un tty'.

Reemplazarlo con una variable resuelve este problema.

tty = $ (tty)

...

El | grep "$ tty" |

Además, cuando no existen sesiones tmux, el código original produciría

Mensaje de error "no se ejecuta ningún servidor en / tmp / tmux-1000 / default" .

Agregar 2>/dev/nully el código se ejecutará sin imprimir el mensaje de error.

El código modificado se lee como:

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}'
Lado positivo
fuente
1
Cual es la mejora? Si es necesario, debe considerar enviarlo como una edición en lugar de una respuesta. Para que sea una buena respuesta, probablemente debería considerar incluir un texto más descriptivo.
Seth
1
@seth, quería comentar pero extrañamente no tenía suficiente crédito para hacerlo.
lado positivo
Necesitas 50 reputación para comentar . Por lo general, no es una buena idea comentar con código complejo ya que carece de saltos de línea, etc. Su edición lo hizo una muy buena respuesta en mi humilde opinión.
Seth
Oh Ahora lo entiendo. El tema "tty" es una cosa bash. No uso ese caparazón de juguete: D
Tim Peoples
1
@TimPeoples Si bien podría ser un problema de Bash. Bash sigue siendo el estándar para codificar los scripts de shell en busca de compatibilidad en terminales modernas. Claro, el estándar posix es ideal; pero, bash tiene algunas características que comparten todos los terminales más avanzados. Al presionar Bash, la mayoría de las otras terminales principales deberían funcionar. Acabo de ejecutar la comprobación de shell y encuentro un montón de errores graves y problemas de formato. (principalmente utilizando la sintaxis anterior en lugar de la sintaxis más descriptiva actual)
ZeroPhase
4
  • La respuesta de Chris Johnsen devuelve un nombre de sesión incluso cuando se realiza una consulta desde fuera de una.
  • El lado positivo y la respuesta de Tim Peoples suponen a tty.

En cambio, descubrí que esto funciona con precisión para mí:

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

No es ideal, pero puede extraer el nombre de la sesión adjunta con awk:

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

El formato personalizado es un poco más fácil de analizar que el predeterminado.

chepner
fuente