Comment savoir si je suis dans une session tmux à partir d'un script bash?

54

Je tiens à garder mon bash_profiledans un dépôt git et clone à ce que les machines que j'ai accès shell. Depuis que je suis dans la tmuxplupart du temps, j'ai une user@hostchaîne dans la ligne d'état, plutôt que sa place traditionnelle dans l'invite du shell.

Cependant, tous les sites que j'utilise ne sont pas tmuxinstallés, sinon je ne l'utilise pas toujours. J'aimerais détecter lorsque je ne suis pas en tmuxsession et ajuster mon invite en conséquence. Jusqu'ici, ma solution à moitié cuite .bash_profileressemble à ceci:

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(Vérifier à chaque fois n'est probablement pas la meilleure approche, alors je suis ouvert aux suggestions pour une meilleure façon de procéder. La création de scripts Bash n'est pas mon fort.)

Brant
la source

Réponses:

73

Tmux définit la TMUXvariable d'environnement dans les sessions tmux et définit TERMsur screen. Ce n'est pas un indicateur fiable à 100% (par exemple, vous ne pouvez pas dire facilement si vous courez screenà l' intérieur tmuxou à l' tmuxintérieur screen), mais cela devrait être suffisant dans la pratique.

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

Si vous avez besoin d'intégrer cela dans un ensemble d'invites complexe via PROMPT_COMMAND(qui est un paramètre bash, d'ailleurs, ne devrait donc pas être exporté):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

Si vous avez besoin de tester si tmux est installé:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

À propos, tout cela devrait aller dans ~/.bashrc, pas ~/.bash_profile(voir Différence entre .bashrc et .bash_profile ). ~/.bashrcest exécuté dans chaque instance bash et contient les personnalisations du shell telles que les invites et les alias. ~/.bash_profileest exécuté lorsque vous vous connectez (si votre shell de connexion est bash). Bizarrement, bash ne lit pas ~/.bashrcdans les shells de login, vous ~/.bash_profiledevriez donc en contenir

case $- in *i*) . ~/.bashrc;; esac
Gilles, arrête de faire le mal
la source
Il existe également une variable alternative TMUX_PANE. J'ai seulement remarqué que votre recette ne fonctionnait pas. Plus tard, j'ai découvert que j'avais indûment utilisé (et par la suite unset) une variable dans un script shell que je recherchais dans mon .profile.
0xC0000022L
[ "$TERM" = "screen" ]peut ne pas fonctionner. Dans mon cas, mon écran était en screen-256couleur.
StevieD
@StevieD Je ne pense pas que tmux le fasse tout seul, mais il pourrait s'agir d'un patch de distribution ou d'une configuration.
Gilles 'SO- arrête d'être méchant'
2

Après avoir essayé différentes méthodes, voici ce qui a finalement fonctionné pour moi, au cas où cela aiderait quelqu'un:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

Dans cet extrait de code, je vérifie si nous ne sommes pas dans l'environnement TMUX, je le lance. Si vous mettez cet extrait de code dans votre .bashrcfichier, vous exécuterez automatiquement TMUX à chaque fois que vous ouvrez un terminal! PS: testé sur le shell Ubuntu.

Alexar
la source
1

Comme pour les réponses précédentes, le test de la ${TERM}variable pourrait conduire à des cas tmuxextrêmes , définissant les variables d'environnement dans sa propre vie

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / default, 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / imil / .tmux / plugins /

Afin de vérifier si vous êtes dans un tmuxenvironnement, vérifiez simplement:

$ [ -z "${TMUX}" ] && echo "not in tmux"

iMil
la source