Je voudrais que mon shell bash par défaut aille directement dans tmux au lieu de toujours devoir taper tmux à chaque fois.
Je voudrais que mon shell bash par défaut aille directement dans tmux au lieu de toujours devoir taper tmux à chaque fois.
Réponses:
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
TERM
il est possible que le .tmux.conf
fichier de l'utilisateur lui attribue une autre valeur . Mieux vaut vérifier si la TMUX
variable est définie ou non.
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
command
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
vérifier l'existence de commandes - https://unix.stackexchange.com/a/85250$PS1
pour vérifier le shell interactif: https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
la variable d'environnement "pour tous les programmes s'exécutant dans tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
avant mais je n'avais pas réalisé que ça existait.
exec
déclaration ne vous permet pas de quitter tmux sans quitter tout le terminal! : |
exec
remplace 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 :)
exec tmux
par votre version préférée detmux attach
exec tmux
utiliser 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 attach
au cas où aucune session ne serait disponible (disponible ici: unix.stackexchange.com/a/176885/256942 )
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 exit
partie:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Notez également que vous ne devriez pas encapsuler tmux attach
avec exec
, car cela entraînerait la fermeture de la connexion en l’absence de session tmux à attacher.
Il y a une commande chsh
qui change le shell de connexion. Consulter man chsh
.
tmux
n’est pas un shell, c’est un multiplexeur de terminaux comme GNU Screen. Il est intéressant de noter que cette -c
option 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. .
ssh $some_server echo foo
).
/etc/shells
, donc c’est un shell de connexion valide.
default-shell
paramètre dans la configuration de tmux pour qu'il pointe vers un shell réel.
J'utilise avec succès
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
dans mon .zshrc
. Si vous utilisez bash, mettez-le à la .bashrc
place.
Je viens également d'essayer de définir tmux
mon 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 foo
elle ne produira aucune sortie.
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 aux commandes, et (non casher , il peut être à certains ..) J'ai coquilles bash avec des commandes à partir là - bas, par exemple Win
+ Alt
+ B
fait 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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
En ajoutant à la réponse de @Louis Maddox, je voudrais exécuter tmux part avec;
(exec tmux attach || exec tmux new-session)
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 :)
tmux new -A -s mysession
travaillera probablement aussi.
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 TMUX
variable d'environnement est non définie / vide, nous ne sommes pas encore dans une session tmux, alors ...
Si tmux has-session
renvoie 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 tmux
comme shell de connexion. Si vous faites cela, cependant, assurez-vous de définir default-shell
un shell réel dans votre ~/.tmux.conf
fichier (voir le manuel de tmux pour plus d'informations à ce sujet).
Vous pouvez (et devriez le faire probablement maintenant) utiliser la chsh
commande 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.
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:
Ajoutez ceci dans votre ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Comme Mikel l’a déjà indiqué dans son commentaire, tmux est l’influence de votre shell de connexion. Mais vous pouvez créer tmux
votre 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/passwd
rechercher 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.
chsh
fait! Sauf que votre chemin nécessite d'être root et est sujet aux erreurs. En cours tmux
d' exécution à partir .bash_login
est plus susceptible de casser les connexions à distance.
[[ $- != *i* ]] && return
de ne pas être une boucle infinie (de la même page)