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?
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.)
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.
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.
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 ".
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.
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
Je viens d'en faire un raccourci clavier (dans Linux Mint pas Ubuntu; donc je ne sais pas si c'est aussi simple) ...
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 exec
utes 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.
Ajouter ce qui suit ligne de code à la fin de .bashrc
,
[[ $TERM != "screen" ]] && exec tmux
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.
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
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
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