Comment puis-je configurer mon shell par défaut pour démarrer tmux

79

Je voudrais que mon shell bash par défaut aille directement dans tmux au lieu de toujours devoir taper tmux à chaque fois.

Michael Durrant
la source

Réponses:

46

Cela semble fonctionner ...

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

Ajoutez simplement la ligne suivante de code bash à votre .bashrc avant vos alias; le code pour les autres shells est très similaire:

[[ $TERM != "screen" ]] && exec tmux
StarNamer
la source
2
Pour moi, cela impliquait également [[ $- != *i* ]] && returnde ne pas être une boucle infinie (de la même page)
Keith Smiley
5
C'est une mauvaise solution car TERMil est possible que le .tmux.conffichier de l'utilisateur lui attribue une autre valeur . Mieux vaut vérifier si la TMUXvariable est définie ou non.
Kusalananda
104

La réponse de @ StarNamer est généralement exacte, bien que j'inclus généralement les tests suivants pour vérifier 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

utilisateur7089
la source
1
Bien, j'en ai eu besoin commandavant mais je n'avais pas réalisé que ça existait.
Freedom_Ben
2
cette execdéclaration ne vous permet pas de quitter tmux sans quitter tout le terminal! : |
Louis Maddox
5
@LouisMaddox: execremplace le processus actuel par un nouveau - dans ce cas, il remplace le shell de connexion bash par tmux. Ainsi, lorsque tmux se ferme, il n'y a plus d'autre terminal vers lequel se replier :)
Mark K Cowan
1
@rjt C'est exact, cela démarre une nouvelle session par conception. Si vous préférez vous connecter à une session tmux existante, remplacez-la simplement exec tmuxpar votre version préférée detmux attach
user7089 le
3
au lieu d’ exec tmuxutiliser exec tmux new-session -A -s main, j’aurai toujours une session appelée main et y sera attachée (au lieu d’en créer une nouvelle chaque fois que je me connecterai à ma machine distante), mais elle ne plantera pas comme si elle n’était pas utilisée tmux attachau cas où aucune session ne serait disponible (disponible ici: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid
16

Ajouter 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 touches pour mettre fin à la connexion. Mais si vous n'aimez pas cela (ce qui me semble très improbable) et préférez rester dans le shell de connexion après la terminaison, supprimez simplement la exitpartie:

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

Notez également que vous ne devriez pas encapsuler tmux attachavec exec, car cela entraînerait la fermeture de la connexion en l’absence de session tmux à attacher.

huangzonghao
la source
J'ai ajouté cette ligne à mon fichier .bashrc, mais maintenant, lorsque je démarre un terminal, je reçois des messages: /home/z/.tmux.conf:10: pas de session en cours (le message se répète pour les lignes 11, 13 et 14 , 15). Ces lignes sont des choses comme "set default-command" exec bash "" et "set default-terminal" screen-256color ".
Matt G
@MattG Sentez-vous comme si quelque chose n'allait pas avec le fichier de configuration tmux.
huangzonghao
5

Il y a une commande chshqui change le shell de connexion. Consulter man chsh.

Paul
la source
6
tmuxn’est pas un shell, c’est un multiplexeur de terminaux comme GNU Screen. Il est intéressant de noter que cette -coption supporte l’ option selon la page de manuel , elle fonctionnera donc assez comme un shell pour l’utiliser comme shell de connexion, mais je suppose que cela ne fonctionnera pas correctement dans toutes les situations, par exemple les connexions graphiques via gdm / kdm. .
Mikel
1
Bien que cela soit raisonnable et soutenu par la documentation, cela semble interrompre l'exécution directe de commande via SSH (quelque chose comme ssh $some_server echo foo).
2014
3
tmux à partir d’au moins 1.8 sur Ubuntu s’ajoute à cela /etc/shells, donc c’est un shell de connexion valide.
Claytron
2
Cela nécessite que vous configuriez le default-shellparamètre dans la configuration de tmux pour qu'il pointe vers un shell réel.
Kusalananda
4

J'utilise avec succès

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

dans mon .zshrc. Si vous utilisez bash, mettez-le à la .bashrcplace.


Je viens également d'essayer de définir tmuxmon shell par défaut ( chsh -s $(which tmux)) et il semble que l'exécution directe de la commande via SSH soit interrompue. Par exemple, ssh $some_server echo fooelle ne produira aucune sortie.

n
la source
3

Aller aux préférences préférentielles. entrez la description de l'image ici

Et puis cliquez sur "commande" barre. entrez la description de l'image ici

Cochez la case "Exécuter une commande personnalisée au lieu de ma vente" et écrivez la commande que vous souhaitez exécuter au démarrage de votre terminal.

utilisateur174935
la source
2

Aucune des réponses ci-dessus n'a fonctionné pour moi - exec tmuxm'empêche de fermer tmux sans quitter le shell (qu'il soit ouvert avec Ctrl+ Tou depuis le menu de l'application).

J'utilise Linux Mint, qui vous permet de mapper certains raccourcis clavier aux commandes, et (non casher , il peut être à certains ..) J'ai coquilles bash avec des commandes à partir là - bas, par exemple Win+ Alt+ Bfait une sorte de alambiquée bash -exec(vim)déclaration modifier 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 ma liste .bashrc. J'ai enveloppé la ligne d'exécution de 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 envelopper tout cela sur une seule ligne, mais pour des raisons de lisibilité, je pense que ça va.

Louis Maddox
la source
Ajouter une esperluette résoudrait le problème de cette manière. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau
1

En ajoutant à la réponse de @Louis Maddox, je voudrais exécuter tmux part avec;

(exec tmux attach || exec tmux new-session)
devrimbaris
la source
J'utilise exec sh -c 'tmux a || tmux'ce qui (après avoir regardé votre réponse) fera probablement de mauvaises choses si tmux ne peut pas commencer pour une raison quelconque ... merci, j'utiliserai le vôtre à partir de maintenant :)
Mark K Cowan
1
tmux new -A -s mysessiontravaillera probablement aussi.
poolie
1

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 TMUXvariable d'environnement est non définie / vide, nous ne sommes pas encore dans une session tmux, alors ...

Si tmux has-sessionrenvoie avec un statut de sortie zéro (true), il est possible d'attacher une session à. Y attacher.

Sinon, créez une nouvelle session.

Il est également possible d'utiliser tmuxcomme shell de connexion. Si vous faites cela, cependant, assurez-vous de définir default-shellun shell réel dans votre ~/.tmux.conffichier (voir le manuel de tmux pour plus d'informations à ce sujet).

Kusalananda
la source
1

Vous pouvez (et devriez le faire probablement maintenant) utiliser la chshcommande pour définir tmux comme shell par défaut, puis ajoutez ce qui suit à .tmux.conf:

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

Rappelez-vous simplement de modifier le chemin en fin de ligne.

Błażej Michalik
la source
1

J'ai combiné les vérifications approfondies, avec la vérification de session conditionnelle, et je l'ai fait moi-même, 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:

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

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

Yosefrow
la source
0

Ajoutez ceci dans votre ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
la source
1
Je pense que vous avez mal compris la question mate! ;)
PhilT
-3

Comme Mikel l’a déjà indiqué dans son commentaire, tmux est l’influence de votre shell de connexion. Mais vous pouvez créer tmuxvotre shell par défaut, littéralement. Le shell par défaut d'un utilisateur est défini dans / etc / passwd. Vous pouvez donc devenir root et éditer le fichier / etc / passwd, par exemple, sudo vi /etc/passwdrechercher la ligne commençant par votre nom d'utilisateur. Cela se termine probablement avec :/bin/bash. Changez / bin / bash en / usr / bin / tmux et tmux est maintenant votre shell de connexion par défaut.

Cependant, rien ne garantit que cela ne posera pas de problèmes!

Ce qui peut fonctionner mieux est de NE PAS faire quoi que ce soit qui requière les privilèges root. J'essayais de créer un fichier dans mon répertoire personnel nommé .bash_login et de démarrer tmux à partir de ce fichier: `echo" tmux "> ~ / .bash_login.

Cela devrait marcher, mais vous devez essayer de le trouver vous-même, car la documentation de bash n’est pas très précise sur le fichier lu et exécuté quand.

Bananguin
la source
2
Votre premier paragraphe décrit ce que chshfait! Sauf que votre chemin nécessite d'être root et est sujet aux erreurs. En cours tmuxd' exécution à partir .bash_loginest plus susceptible de casser les connexions à distance.
Gilles 'SO- arrête d'être méchant'