GNU/Linux >> Tutoriels Linux >  >> Linux

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

J'aime garder mon bash_profile dans un référentiel git et clonez-le sur toutes les machines auxquelles j'ai accès au shell. Depuis que je suis dans tmux la plupart du temps j'ai un [email protected] chaîne dans la ligne d'état, plutôt que son emplacement traditionnel dans l'invite du shell.

Tous les sites que j'utilise n'ont pas tmux installé, ou je ne l'utilise pas toujours. Je voudrais détecter quand je ne suis pas dans un tmux session et ajuster mon invite en conséquence. Jusqu'à présent, ma solution à moitié cuite dans .bash_profile ressemble à 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, donc je suis ouvert aux suggestions pour une meilleure façon de procéder. Les scripts bash ne sont pas mon fort.)

Réponse acceptée :

Tmux définit le TMUX variable d'environnement dans les sessions tmux et définit TERM à screen . Ce n'est pas un indicateur fiable à 100 % (par exemple, vous ne pouvez pas savoir facilement si vous utilisez screen dans tmux ou tmux à l'intérieur de l'screen ), mais cela devrait suffire en pratique.

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

Si vous devez intégrer cela dans un ensemble d'invites complexes via PROMPT_COMMAND (qui est un paramètre bash, soit dit en passant, 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 jamais 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

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

case $- in *i*) . ~/.bashrc;; esac

Linux
  1. Empêcher un script bash de s'exécuter simultanément

  2. Comment appeler une fonction Bash dans le script Bash à l'intérieur d'Awk ?

  3. Comment exécuter des scripts Python à partir du shell

  4. Comment diviser une chaîne dans un script bash

  5. Bash Script - Comment lire l'entrée de l'utilisateur

Comment exécuter un script bash {7 méthodes}

Comment écrire un script bash avec des exemples

Bash break :comment sortir d'une boucle

Comment exécuter un script bash

Script bash :utilisation de la commande de script d'un script bash pour la journalisation d'une session

Comment obtenir un masque de réseau à partir de bash ?