GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo saber si estoy en una sesión Tmux desde un script Bash?

Me gusta mantener mi bash_profile en un repositorio de git y clonarlo en cualquier máquina a la que tenga acceso de shell. Ya que estoy en tmux la mayor parte del tiempo tengo un [email protected] cadena en la línea de estado, en lugar de su lugar tradicional en el indicador de shell.

No todos los sitios que uso tienen tmux instalado, sin embargo, o puede que no siempre lo esté usando. Me gustaría detectar cuando no estoy en un tmux sesión y ajustar mi solicitud en consecuencia. Hasta ahora, mi solución a medias en .bash_profile se parece 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, por lo que estoy abierto a sugerencias para una mejor manera de hacerlo. Bash scripting no es mi fuerte).

Respuesta aceptada:

Tmux establece el TMUX variable de entorno en sesiones tmux y establece TERM a screen . Este no es un indicador 100% confiable (por ejemplo, no puede saber fácilmente si está ejecutando screen dentro de tmux o tmux dentro de 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 de mensajes complejo a través de PROMPT_COMMAND (que, por cierto, es una configuración bash, por lo que no debe 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 ir a ~/.bashrc , no ~/.bash_profile (ver Diferencia entre .bashrc y .bash_profile). ~/.bashrc se ejecuta en cada instancia de bash y contiene personalizaciones de shell, como avisos y alias. ~/.bash_profile se ejecuta cuando inicia sesión (si su shell de inicio de sesión es bash). Curiosamente, bash no lee ~/.bashrc en shells de inicio de sesión, por lo que su ~/.bash_profile debe contener

case $- in *i*) . ~/.bashrc;; esac

Linux
  1. ¿Cómo depurar un script Bash?

  2. ¿Cómo saber en qué versión de Os X estoy desde la línea de comandos?

  3. ¿Cómo establecer parámetros cuando Pipe Bash Script to Bash?

  4. Bash + ¿Cómo salir del script secundario y del script principal en ambas ocasiones?

  5. Cómo ejecutar scripts de Python desde shell

Cómo ejecutar un script Bash {7 métodos}

Cómo escribir un script Bash con ejemplos

Bash break:cómo salir de un bucle

Evitar que un script bash se ejecute simultáneamente

Cómo ejecutar un script Bash

¿Cómo obtener máscara de red de bash?