web-dev-qa-db-fra.com

Comment puis-je activer TMUX lorsque je démarre une nouvelle session Shell?

Au lieu d'avoir à taper tmux à chaque fois, comment pourrais-je avoir tmux toujours utilisé pour les nouvelles fenêtres de session?

Donc, si je n'ai aucune fenêtre de terminal ouverte et que j'en ouvre une, comment cette première session peut-elle être dans tmux?

On dirait un .bashrc genre de chose peut-être?

60
Michael Durrant

avertissement cela peut maintenant 'corrompre' (le rendre incapable d'ouvrir une fenêtre de terminal - ce qui n'est pas bon!) vos connexions Ubuntu. Utilisez avec une extrême prudence et assurez-vous d'avoir un deuxième compte administrateur sur l'ordinateur auquel vous pouvez vous connecter au cas où vous auriez les mêmes problèmes que moi. Voir mon autre répondez pour plus de détails et une approche différente.

Compte tenu de cet avertissement, la solution la plus simple consiste à ajouter l'invocation tmux à la fin de votre .bashrc, par exemple.

alias g="grep"
alias ls="ls --color=auto"

# ...other stuff...

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

Notez que exec signifie que le processus bash qui démarre lorsque vous ouvrez le terminal est remplacé par tmux, donc Ctrl-B D (c'est-à-dire se déconnecter de tmux) ferme la fenêtre, au lieu de revenir au processus bash d'origine, quel est probablement le comportement que vous souhaitez?

De plus, l'instruction if est requise (elle détecte si la fenêtre bash actuelle est déjà dans un processus tmux) sinon, à chaque démarrage de tmux, le processus bash contenu tentera de démarrer sa propre session tmux, conduisant à un nombre infini de tmuxen imbriqués qui peuvent être, euh, assez ennuyeux (cela dit, ça a l'air cool).


Cependant, il y a un très petit risque que cela puisse faire que bash se comporte d'une manière à laquelle d'autres programmes ne s'attendent pas, car l'exécution de bash peut éventuellement le transformer en un processus tmux, il serait donc préférable de modifier comment vous démarrez votre émulateur de terminal.

J'utilise un petit script Shell exécutable ~/bin/terminal (avec ~/bin dans $PATH, donc on le trouve automatiquement) qui ressemble un peu à:

#!/bin/sh
exec gnome-terminal -e tmux

(Je n'utilise pas gnome-terminal, donc vous devrez peut-être supprimer le exec, je ne suis pas sûr.)

Maintenant, chaque fois que vous exécutez le scipt terminal, vous avez un terminal avec tmux. Vous pouvez l'ajouter à vos raccourcis de menu/bureau/clavier pour remplacer le terminal par défaut.

(Cette approche vous permet également de personnaliser plus facilement d'autres choses sur l'émulateur de terminal plus tard, si vous le souhaitez.)

65
huon

Ma réponse originale et acceptée a cessé de fonctionner sur mon système Ubuntu14 après une récente mise à niveau.

Utiliser soit

[ -z "$TMUX" ] && command -v tmux > /dev/null && TERM=xterm-256color && exec tmux

ou

[ $TERM != "screen" ] && TERM=xterm-256color && exec tmux

m'empêcherait même de me connecter. Je n'ai pu résoudre ce problème qu'en raison d'une deuxième connexion administrateur sur l'ordinateur.

La solution pour moi sur Ubuntu (et dans osx aussi) était de changer mon programme de terminal pour exécuter réellement tmux à la place, c'est-à-dire.

enter image description here

J'ai toujours

[ `uname -s` != Linux ] && exec tmux

comme mon dernier .bashrc line mais que c'est uniquement pour mes systèmes Mac OSX maintenant.

15
Michael Durrant

Si vous voulez avoir une seule session tmux, mettez ce qui suit dans votre ~/.bashrc pour bash ou ~/.zshrc pour zsh:

tmux attach &> /dev/null

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

Le tmux attach line est pour vous assurer qu'il y a une session à laquelle il s'attache et s'il n'y a pas eu de session, vous n'obtiendrez pas l'avertissement " no session ".

14
K.H.A.

Pour moi, j'aimerais que mon tmux soit démarré chaque fois que je shell sur ma machine distante, et lorsque je me détache ou quitte de tmux, la connexion doit être fermée automatiquement. Après avoir exploré ce problème pendant un certain temps, le code suivant fait exactement ce que je veux et est censé être le plus optimisé au meilleur de ma connaissance.

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

Notez que cette ligne doit être la première ligne de votre fichier bashrc pour vous assurer qu'elle est chargée en premier. Nous ne pouvons pas mettre un appel "exec" devant "tmux attach" car après que l'exec ait remplacé le processus bash par le tmux, la connexion sera fermée même s'il n'y a pas de session à attacher. Par conséquent, nous avons besoin d'un appel "exit" pour mettre fin à la connexion après avoir détaché ou quitté les sessions attachées. Mais mettre un "exec" devant la commande new-session est très bien car c'est la dernière commande à exécuter.

7
huangzonghao

J'ai commencé avec cela https://wiki.archlinux.org/index.php/Tmux#Bash et l'ai amélioré pour récupérer des sessions détachées et en créer de nouvelles si toutes les sessions étaient déjà attachées

# .bashrc

case $- in
    *i*)
    if command -v tmux>/dev/null; then
        if [[ ! $TERM =~ screen ]] && [[ -z $TMUX ]]; then
          if tmux ls 2> /dev/null | grep -q -v attached; then
            exec tmux attach -t $(tmux ls 2> /dev/null | grep -v attached | head -1 | cut -d : -f 1)
          else
            exec tmux
          fi
        fi
    fi
    ;;
esac
3
Lee Ballard

Je viens d'en faire un raccourci clavier (dans Linux Mint pas Ubuntu; donc je ne sais pas si c'est aussi simple) ...


custom shortcut for tmux terminal


Cela peut être difficile à voir, mais le raccourci personnalisé est gnome-terminal --window --maximize -e tmux. Cela démarre un nouveau gnome-terminal fenêtre agrandie puis executes tmux pour vous.

J'ai également un autre raccourci personnalisé qui démarre un "normal" gnome-terminal maximisé (c'est la même chose sans le -e tmux).

Je pense que c'est la meilleure façon parce que vous pouvez démarrer n'importe quel terminal comme vous le souhaitez et c'est la manière la plus personnalisable.

3
dylnmc

Ajouter ce qui suit ligne de code à la fin de .bashrc,

[[ $TERM != "screen" ]] && exec tmux
3
prayagupd

Pour activer tmux pour les sessions de connexion et ssh, vous pouvez ajouter ceci à la fin de votre .bashrc:

# enable tmux at login
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then
  exec tmux
fi

Ce script recherche le processus parent du shell bash. Si bash a été démarré depuis la connexion ou depuis ssh, il exécutera tmux. Si vous souhaitez que cela fonctionne avec un terminal GUI, vous pouvez également l'ajouter ici. Par exemple, si vous souhaitez démarrer tmux automatiquement lorsque vous démarrez le standard d'Ubuntu gnome-terminal, vous utiliseriez ceci:

PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then
  exec tmux
fi

J'ai testé ce qui précède sur Live Ubuntu Desktop et j'ai pu me connecter par la suite. Cela ne devrait pas interrompre la connexion à l'interface graphique, sauf si elle appelle la commande de connexion pour se connecter. Je ne connais pas d'interface graphique Linux qui le fasse.

2
ekrekeler

Dans xfce4 (j'utilise Fedora 24 XFCE spin, c'est génial), j'ai trouvé que la solution la plus simple est de modifier les raccourcis du panneau pour qu'ils fonctionnent:

xfce4-terminal -e tmux

Cette même commande peut être utilisée pour remplacer le raccourci d'application clavier.

J'avais précédemment inséré une instruction if dans mon .bashrc, mais cela a entraîné l'échec de la connexion (retour à la boîte de connexion chaque fois qu'un mot de passe correct a été entré).

La commande de la commande Ouvrir le terminal ici de Thunar diffère légèrement. Pour changer ce goto:

Thunar> Modifier> Configurer des actions personnalisées ...> Ouvrir le terminal ici> bouton Modifier et remplacer:

exo-open --working-directory% f --launch TerminalEmulator

avec: xfce4-terminal --working-directory% f -e tmux

2
Duncan Betts

Une ligne qui s'assure également que le type de terminal est correctement défini pour 256 couleurs:

[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux
1
Michael Durrant

Que diriez-vous d'ajouter

# If not running interactively, do not do anything
[[ $- != *i* ]] && return
[[ -z "$TMUX" ]] && exec tmux

à votre .bashrc. Cela fonctionne également pour zsh.

Tiré de https://wiki.archlinux.org/index.php/Tmux#Start_tmux_with_default_session_layout

0
theDrifter