Wie kann ich anhand eines Bash-Skripts feststellen, ob ich in einer tmux-Sitzung bin?

53

Ich möchte mein bash_profilein einem Git-Repository aufbewahren und es auf alle Maschinen klonen, auf die ich Shell-Zugriff habe. Da ich die tmuxmeiste Zeit über eine user@hostZeichenfolge in der Statuszeile habe, wird diese nicht wie üblich in der Shell-Eingabeaufforderung angezeigt.

Es sind jedoch nicht alle von mir verwendeten Sites tmuxinstalliert, oder ich verwende sie möglicherweise nicht immer. Ich möchte erkennen, wann ich nicht in einer tmuxSitzung bin, und meine Eingabeaufforderung entsprechend anpassen. Bisher .bash_profilesieht meine halbgebackene Lösung in etwa so aus:

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

(Jedes Mal zu überprüfen ist wahrscheinlich nicht der beste Ansatz. Daher bin ich offen für Vorschläge für eine bessere Vorgehensweise. Bash-Skripte sind nicht meine Stärke.)

Brant
quelle

Antworten:

72

Tmux setzt die TMUXUmgebungsvariable in tmux-Sitzungen und setzt TERMauf screen. Dies ist kein zu 100% zuverlässiger Indikator (zum Beispiel kann man nicht leicht erkennen, ob man screendrinnen tmuxoder tmuxdrinnen läuft screen), aber er sollte in der Praxis gut genug sein.

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

Wenn Sie das in ein komplexes Prompt-Set über integrieren müssen PROMPT_COMMAND(was übrigens eine Bash-Einstellung ist, sollte also nicht exportiert werden):

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

Wenn Sie jemals testen müssen, ob tmux installiert ist:

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

Übrigens sollte dies alles ~/.bashrcnicht sein ~/.bash_profile(siehe Unterschied zwischen .bashrc und .bash_profile ). ~/.bashrcwird in jeder Bash-Instanz ausgeführt und enthält Shell-Anpassungen wie Eingabeaufforderungen und Aliase. ~/.bash_profilewird ausgeführt, wenn Sie sich anmelden (wenn Ihre Anmeldeshell bash ist). Seltsamerweise liest bash keine ~/.bashrcLogin-Shells ein, Sie ~/.bash_profilesollten also enthalten

case $- in *i*) . ~/.bashrc;; esac
Gilles 'SO - hör auf böse zu sein'
quelle
Es gibt auch eine alternative Variable TMUX_PANE. Ich habe es nur bemerkt, weil dein Rezept nicht funktioniert hat. Später stellte ich fest, dass ich unseteine Variable in einem Shell-Skript, das ich über my beschaffe, über Gebühr verwendet hatte (und anschließend ) .profile.
0xC0000022L
[ "$TERM" = "screen" ]funktioniert möglicherweise nicht. In meinem Fall wurde mein Bildschirm als screen-256Farbe gemeldet .
StevieD
@StevieD Ich glaube nicht, dass tmux dies alleine macht, aber es könnte ein Distributions-Patch oder eine Konfiguration sein.
Gilles 'SO- hör auf böse zu sein'
2

Nachdem ich verschiedene Methoden ausprobiert habe, hat dies letztendlich für mich funktioniert, falls es jemandem da draußen hilft:

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

In diesem Code-Snippet überprüfe ich, ob wir nicht in der TMUX-Umgebung sind. Ich starte es. Wenn Sie diesen .bashrcCodeausschnitt in Ihre Datei einfügen, wird TMUX automatisch ausgeführt, sobald Sie das Terminal öffnen! PS: auf Ubuntu-Shell getestet.

Alexar
quelle
1

Wie bei früheren Antworten kann das Testen der ${TERM}Variablen zu Eckfällen führen und tmuxUmgebungsvariablen in ihrem eigenen Leben festlegen:

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

Um zu überprüfen, ob Sie sich in einer tmuxUmgebung befinden, überprüfen Sie einfach:

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

iMil
quelle