Je voudrais que mon shell bash par défaut passe directement dans tmux au lieu de devoir toujours taper tmux à chaque fois.
Démarrez tmux à chaque connexion Shell , depuis Arch wiki, semble fonctionner. Ajoutez simplement la ligne suivante de code bash à votre .bashrc
devant vos alias; le code des autres shells est très similaire:
[[ $TERM != "screen" ]] && exec tmux
@ La réponse de StarNamer est généralement exacte, bien que j'inclue généralement les tests suivants pour m'assurer que (1) tmux existe sur le système, (2) nous sommes dans un shell interactif et (3) tmux n'essaie pas de s'exécuter dans lui-même:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
Références
command
de bash pour vérifier l'existence d'une commande - http://man7.org/linux/man-pages/man1/bash.1.html#Shell_BUILTIN_COMMANDScommand
au lieu de which
pour vérifier l'existence de commandes - https://unix.stackexchange.com/a/8525$PS1
pour vérifier le shell interactif - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
variable d'environnement "pour tous les programmes exécutés dans tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANESAjout d'une ligne comme
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
dans votre fichier bashrc fera probablement le travail. Notez que cette ligne quittera ssh et mettra fin à la connexion une fois que vous aurez détaché ou quitté tmux. J'aime cette configuration car elle enregistre les coups de touche pour mettre fin à la connexion. Mais si vous n'aimez pas cela (ce qui, je pense, est très peu probable) et que vous préférez rester dans le shell de connexion après la résiliation, supprimez simplement la partie exit
:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Notez également que vous ne devez pas envelopper tmux attach
avec exec
, car cela entraînerait la fermeture de la connexion lorsqu'il n'y a aucune session tmux à laquelle se connecter.
Il existe la commande chsh
qui modifie le shell de connexion. Consulter man chsh
.
J'utilise avec succès
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
dans mon .zshrc
. Si vous utilisez bash, placez-le à la place dans votre .bashrc
.
J'ai également essayé de définir tmux
comme shell par défaut (chsh -s $(which tmux)
) et il semble rompre l'exécution directe des commandes via SSH, par exemple ssh $some_server echo foo
Ne produira aucune sortie.
Ajoutant à la réponse de @Louis Maddox, j'exécuterais la partie tmux avec;
(exec tmux attach || exec tmux new-session)
J'ai combiné les vérifications approfondies, avec la vérification de session conditionnelle, et y ai mis ma propre rotation, pour créer une session par défaut qui est connectée à ou créée. Sauf si vous êtes à l'intérieur d'une autre session tmux ou si d'autres conditions de protection sont remplies.
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
Sur la base de ces réponses:
Aucune des réponses ci-dessus n'a fonctionné pour moi - exec tmux
M'empêche de fermer tmux sans quitter le shell (qu'il soit ouvert avec Ctrl
+ T
ou depuis le menu de l'application).
J'utilise Linux Mint, qui vous permet de mapper certains raccourcis clavier vers des commandes, et (non cachère comme cela peut l'être pour certains ..) J'ai des shells bash avec des commandes démarrant là-bas, par exemple Win
+ Alt
+ B
fait une sorte d'instruction alambiquée bash -exec(vim)
pour éditer mon .bashrc, donc il agit comme un Shell normal.
tmux a chargé plutôt que vim dans cette situation après avoir placé ce qui précède en haut de mon .bashrc
. J'ai encapsulé la ligne d'exécution tmux dans une autre instruction if, en vérifiant qu'elle fonctionne en mode interactif.
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
Vous pouvez regrouper tout cela sur une seule ligne, mais pour plus de lisibilité, je pense que ça va.
Vous pouvez (et devez probablement le faire maintenant) utiliser la commande chsh
pour définir tmux comme shell par défaut, puis ajouter ce qui suit à .tmux.conf
:
set-option -g default-Shell /path/to/your/favourite/Shell
N'oubliez pas de modifier le chemin à la fin de la ligne.
C'est dans mon ~/.profile
(J'utilise ksh93
):
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
Si la variable d'environnement TMUX
n'est pas définie/vide, alors nous ne sommes pas déjà dans une session tmux, alors ...
Si tmux has-session
retourne avec un état de sortie nul (vrai), il y a une session disponible à attacher. Attachez-y.
Sinon, créez une nouvelle session.
Il est également possible d'utiliser tmux
comme shell de connexion. Si vous procédez ainsi, assurez-vous de définir default-Shell
vers un shell réel dans votre ~/.tmux.conf
fichier (voir le manuel tmux pour plus d'informations à ce sujet).
cela rend tmux ouvert par défaut sur tous les nouveaux Shell d'utilisateurs
cmd='[ $TERM == screen ] || exec tmux'
echo -e "$cmd\n$(cat ~/.bashrc)" > ~/.bashrc
Ajoutez ceci dans votre ~/.tmux.conf
set -g default-command /usr/local/bin/fish