Me gustaría que mi bash shell predeterminado vaya directamente a tmux en lugar de que siempre tenga que escribir tmux cada vez.
Me gustaría que mi bash shell predeterminado vaya directamente a tmux en lugar de que siempre tenga que escribir tmux cada vez.
Respuestas:
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
TERM
del usuario puede establecer otro valor .tmux.conf
. Es mejor verificar si la TMUX
variable está establecida o no.
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
command
para verificar la existencia de un comando: http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
lugar de which
verificar la existencia de comandos - https://unix.stackexchange.com/a/85250$PS1
para verificar el shell interactivo: https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
la variable de entorno "para todos los programas que se ejecutan dentro de tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
antes pero no me di cuenta de que existía.
exec
declaración no le permite salir de tmux sin salir de la terminal completa! : |
exec
reemplaza 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 :)
exec tmux
con su sabor preferido detmux attach
exec tmux
usar, exec tmux new-session -A -s main
por 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 attach
en caso de que no haya una sesión disponible (que se encuentra aquí: unix.stackexchange.com/a/176885/256942 )
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 exit
parte:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
También tenga en cuenta que no debe envolver tmux attach
con exec
, ya que esto causa que la conexión se cierra cuando no hay sesiones TMux para adjuntar a.
Hay un comando chsh
que cambia el shell de inicio de sesión. Consultar man chsh
.
tmux
no es un shell, es un multiplexor terminal como la pantalla GNU. Curiosamente, admite la -c
opció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 .
ssh $some_server echo foo
).
/etc/shells
, por lo que es un shell de inicio de sesión válido.
default-shell
configuración en la configuración de tmux para que apunte a un shell real.
Estoy usando con éxito
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
en mi .zshrc
. Si estás usando bash, ponlo en tu .bashrc
lugar.
También intenté configurarlo tmux
como 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.
Ninguna de las respuestas anteriores funcionó para mí: me exec tmux
impide cerrar tmux sin salir del shell (ya sea que se abra con Ctrl
+ T
o 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
+ B
hace 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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Agregando a la respuesta de @Louis Maddox, ejecutaría tmux part con;
(exec tmux attach || exec tmux new-session)
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 :)
tmux new -A -s mysession
probablemente también funcionará.
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 TMUX
variable de entorno no está configurada / vacía, entonces aún no estamos en una sesión tmux, así que ...
Si tmux has-session
regresa 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 tmux
como su shell de inicio de sesión. Sin embargo, si hace esto, asegúrese de establecer default-shell
un shell real en su ~/.tmux.conf
archivo (consulte el manual de tmux para obtener más información al respecto).
Podrías (y probablemente ahora deberías) usar el chsh
comando 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.
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:
Agregue esto a su ~/.tmux.conf
set -g default-command /usr/local/bin/fish
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 tmux
tu 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/passwd
busque 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.
chsh
hace! Excepto que su camino requiere ser root y es propenso a errores. Ejecutar tmux
desde .bash_login
es más probable que rompa inicios de sesión remotos.
[[ $- != *i* ]] && return
no ser un ciclo infinito (de la misma página)