¿Cómo puedo saber si estoy en una sesión tmux desde un script bash?

54

Me gusta mantener mi bash_profileen un repositorio git y clonarlo a cualquier máquina a la que tenga acceso de shell. Como estoy en la tmuxmayoría de las veces, tengo una user@hostcadena en la línea de estado, en lugar de su lugar tradicional en el indicador de comandos de shell.

Sin tmuxembargo, no todos los sitios que uso se han instalado o no siempre lo estoy usando. Me gustaría detectar cuándo no estoy en una tmuxsesión y ajustar mi mensaje en consecuencia. Hasta ahora, mi solución a medio cocer se .bash_profileparece a esto:

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(Verificar cada vez probablemente no sea el mejor enfoque, así que estoy abierto a sugerencias para una mejor manera de hacerlo. Las secuencias de comandos Bash no son mi fuerte).

Brant
fuente

Respuestas:

73

Tmux establece la TMUXvariable de entorno en sesiones tmux y establece TERMen screen. Este no es un indicador 100% confiable (por ejemplo, no se puede saber fácilmente si se está ejecutando screendentro tmuxo tmuxdentro screen), pero debería ser lo suficientemente bueno en la práctica.

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

Si necesita integrar eso en un conjunto complejo de mensajes vía PROMPT_COMMAND(que es una configuración bash, por cierto, no debería exportarse):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

Si alguna vez necesita probar si tmux está instalado:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

Por cierto, todo esto debería entrar ~/.bashrc, no ~/.bash_profile(ver Diferencia entre .bashrc y .bash_profile ). ~/.bashrcse ejecuta en cada instancia de bash y contiene personalizaciones de shell, como mensajes y alias. ~/.bash_profilese ejecuta cuando inicia sesión (si su shell de inicio de sesión es bash). Curiosamente, bash no lee ~/.bashrcen los shells de inicio de sesión, por lo que ~/.bash_profiledebe contener

case $- in *i*) . ~/.bashrc;; esac
Gilles 'SO- deja de ser malvado'
fuente
También hay una variable alternativa TMUX_PANE. Solo me di cuenta porque tu receta no funcionó. Más tarde descubrí que había usado indebidamente (y posteriormente unset) una variable en un script de shell que obtengo a través de mi .profile.
0xC0000022L
[ "$TERM" = "screen" ]puede que no funcione. En mi caso, mi pantalla informaba como screen-256color.
StevieD
@StevieD No creo que tmux haga esto por sí solo, pero podría ser un parche de distribución o configuración.
Gilles 'SO- deja de ser malvado'
2

Después de probar diferentes formas, esto es lo que finalmente funcionó para mí, en caso de que ayude a alguien:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

En este fragmento de código, verifico si no estamos en el entorno TMUX, lo ejecuto. Si coloca este fragmento de código en su .bashrcarchivo, ejecutará automáticamente TMUX cada vez que abra la terminal. PD: probado en Ubuntu Shell.

Alexar
fuente
1

En cuanto a las respuestas anteriores, probar la ${TERM}variable podría conducir a casos de esquina, tmuxestablece variables de entorno dentro de su propia vida:

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / predeterminado, 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / imil / .tmux / plugins /

Para verificar si está dentro de un tmuxentorno, simplemente verifique:

$ [ -z "${TMUX}" ] && echo "not in tmux"

iMil
fuente