¿Cómo puedo configurar mi shell predeterminado para iniciar tmux?

79

Me gustaría que mi bash shell predeterminado vaya directamente a tmux en lugar de que siempre tenga que escribir tmux cada vez.

Michael Durrant
fuente

Respuestas:

46

Esto parece funcionar ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Simplemente agregue la siguiente línea de código bash a su .bashrc antes de sus alias; El código para otros shells es muy similar:

[[ $TERM != "screen" ]] && exec tmux
StarNamer
fuente
2
Para mí, esto también requería [[ $- != *i* ]] && returnno ser un ciclo infinito (de la misma página)
Keith Smiley
55
Esta es una mala solución, ya que el archivo TERMdel usuario puede establecer otro valor .tmux.conf. Es mejor verificar si la TMUXvariable está establecida o no.
Kusalananda
104

La respuesta de @ StarNamer es generalmente precisa, aunque generalmente incluyo las siguientes pruebas para asegurarme de que (1) tmux existe en el sistema, (2) estamos en un shell interactivo y (3) tmux no intenta ejecutarse dentro de sí mismo:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Referencias

usuario7089
fuente
1
Bien, lo he necesitado commandantes pero no me di cuenta de que existía.
Freedom_Ben
2
¡Esta execdeclaración no le permite salir de tmux sin salir de la terminal completa! : |
Louis Maddox
55
@LouisMaddox: execreemplaza el proceso actual por uno nuevo; en este caso, reemplaza el shell de inicio de sesión de bash por tmux, por lo que cuando tmux sale, no hay otro terminal al que recurrir :)
Mark K Cowan
1
@rjt Eso es correcto, esto inicia una nueva sesión por diseño. Si prefiere adjuntarse a una sesión tmux existente, simplemente reemplácela exec tmuxcon su sabor preferido detmux attach
user7089
2
en lugar de exec tmuxusar, exec tmux new-session -A -s mainpor lo que siempre tendré una sesión llamada main y la adjuntaré (en lugar de crear una nueva cada vez que me conecte a mi máquina remota) pero no se bloqueará como se usa tmux attachen caso de que no haya una sesión disponible (que se encuentra aquí: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid
16

Agregar una línea como

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

en su archivo bashrc probablemente hará el trabajo. Tenga en cuenta que esta línea saldrá de ssh y finalizará la conexión una vez que desconecte o salga de tmux. Me gusta esta configuración, ya que guarda las pulsaciones de teclas para terminar la conexión. Pero si no le gusta esto (lo cual creo que es muy poco probable) y prefiere permanecer en el shell de inicio de sesión después de la finalización, simplemente elimine la exitparte:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

También tenga en cuenta que no debe envolver tmux attachcon exec, ya que esto causa que la conexión se cierra cuando no hay sesiones TMux para adjuntar a.

huangzonghao
fuente
He agregado esta línea a mi .bashrc, pero ahora cuando inicio una terminal, recibo algunos mensajes: /home/z/.tmux.conf:10: no hay sesión actual (el mensaje se repite para las líneas 11, 13, 14 , 15). Esas líneas son cosas como "set default-command" exec bash "" y "set default-terminal" screen-256color ".
Matt G
@MattG Siente que hay algo mal con el archivo de configuración de tmux.
Huangzonghao
5

Hay un comando chshque cambia el shell de inicio de sesión. Consultar man chsh.

Pablo
fuente
66
tmuxno es un shell, es un multiplexor terminal como la pantalla GNU. Curiosamente, admite la -copción de acuerdo con la página de manual , por lo que puede funcionar como un shell lo suficiente como para usarlo como su shell de inicio de sesión, pero sospecho que no funcionará correctamente en todas las situaciones, por ejemplo, inicios de sesión gráficos a través de gdm / kdm .
Mikel
1
Aunque esto es razonable y está respaldado por la documentación, parece interrumpir la ejecución directa de comandos a través de SSH (algo así como ssh $some_server echo foo).
n
3
tmux a partir de al menos 1.8 en Ubuntu se agrega a sí mismo /etc/shells, por lo que es un shell de inicio de sesión válido.
claytron
2
Esto requiere que configure la default-shellconfiguración en la configuración de tmux para que apunte a un shell real.
Kusalananda
4

Estoy usando con éxito

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

en mi .zshrc. Si estás usando bash, ponlo en tu .bashrclugar.


También intenté configurarlo tmuxcomo mi shell predeterminado ( chsh -s $(which tmux)) y parece interrumpir la ejecución directa de comandos a través de SSH, por ejemplo ssh $some_server echo foo, no producirá ningún resultado.

n.st
fuente
3

Ir a las preferencias de terminal. ingrese la descripción de la imagen aquí

Y luego haga clic en la barra de "comando". ingrese la descripción de la imagen aquí

Marque la opción "Ejecutar un comando personalizado en lugar de mi venta" y escriba el comando que desee ejecutar al inicio de su terminal.

usuario174935
fuente
1

Ninguna de las respuestas anteriores funcionó para mí: me exec tmuximpide cerrar tmux sin salir del shell (ya sea que se abra con Ctrl+ To desde el menú de la aplicación).

Utilizo Linux Mint, que le permite asignar ciertas teclas de acceso rápido a comandos, y (aunque no sea kosher para algunos ...) Tengo bash shells con comandos que comienzan allí, por ejemplo, Win+ Alt+ Bhace algún tipo de bash -exec(vim)enunciado complicado edito mi .bashrc, para que actúe como un shell normal.

tmux cargó en lugar de vim en esa situación después de colocar lo anterior en la parte superior de mi .bashrc. He envuelto la línea de ejecución de tmux en otra instrucción if, verificando que se esté ejecutando en modo interactivo.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

Podrías envolver todo eso en una línea, pero para facilitar la lectura, creo que está bien.

Louis Maddox
fuente
Agregar un ampersand resolvería ese problema así. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau
1

Agregando a la respuesta de @Louis Maddox, ejecutaría tmux part con;

(exec tmux attach || exec tmux new-session)
devrimbaris
fuente
Yo uso exec sh -c 'tmux a || tmux', que (después de ver su respuesta) probablemente hará que sucedan cosas malas si tmux no puede comenzar por alguna razón ... gracias, usaré la suya de ahora en adelante :)
Mark K Cowan
1
tmux new -A -s mysessionprobablemente también funcionará.
Poolie
1

Esto está en mi ~/.profile(estoy usando ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Si la TMUXvariable de entorno no está configurada / vacía, entonces aún no estamos en una sesión tmux, así que ...

Si tmux has-sessionregresa con un estado de salida cero (verdadero), hay una sesión disponible para adjuntar. Adjuntar a ella.

Si no, cree una nueva sesión.

También es posible usarlo tmuxcomo su shell de inicio de sesión. Sin embargo, si hace esto, asegúrese de establecer default-shellun shell real en su ~/.tmux.confarchivo (consulte el manual de tmux para obtener más información al respecto).

Kusalananda
fuente
1

Podrías (y probablemente ahora deberías) usar el chshcomando para configurar tmux como shell predeterminado y luego agregar lo siguiente a .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Solo recuerde modificar la ruta al final de la línea.

Błażej Michalik
fuente
1

Combiné las comprobaciones extensivas, con la comprobación de sesión condicional, y le di mi propio giro, para crear una sesión predeterminada que está conectada o creada. A menos que esté dentro de otra sesión de tmux, o se cumplan otras condiciones de protección.

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

Basado en estas respuestas:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

Yosefrow
fuente
0

Agregue esto a su ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
fuente
1
¡Creo que entendiste mal la pregunta, amigo! ;)
PhilT
-3

Como Mikel ya dijo en su comentario que tiene tmux como su shell de inicio de sesión puede tener efectos secundarios. Pero puedes hacer tmuxtu shell predeterminado, literalmente. El shell predeterminado de un usuario se define en / etc / passwd. Para que pueda convertirse en root y editar / etc / passwd, por ejemplo, sudo vi /etc/passwdbusque la línea que comienza con su nombre de usuario. Probablemente termina con :/bin/bash. Cambie / bin / bash a / usr / bin / tmux y ahora tmux es su shell de inicio de sesión predeterminado.

Sin embargo, no hay garantía de que esto no cause problemas.

Lo que puede funcionar mejor es NO hacer nada que requiera privilegios de root. Intentaría crear un archivo en mi directorio de inicio llamado .bash_login e iniciar tmux desde ese archivo: `echo" tmux "> ~ / .bash_login.

Esto debería funcionar, pero debe intentar encontrarlo usted mismo, porque la documentación de bash no es muy exacta sobre qué archivo se lee y se ejecuta cuando.

Bananguin
fuente
2
¡Lo que tu primer párrafo describe es lo que chshhace! Excepto que su camino requiere ser root y es propenso a errores. Ejecutar tmuxdesde .bash_logines más probable que rompa inicios de sesión remotos.
Gilles