Jak mogę sprawdzić, czy jestem w sesji tmux na podstawie skryptu bash?

53

Chciałbym, aby moje bash_profilew repozytorium git i sklonować go do maszyny, co mam dostęp do powłoki. Ponieważ przez tmuxwiększość czasu mam user@hostciąg znaków w wierszu stanu, a nie jego tradycyjne miejsce w wierszu poleceń powłoki.

tmuxJednak nie wszystkie witryny, z których korzystam, zostały zainstalowane lub nie zawsze mogę z nich korzystać. Chciałbym wykryć, kiedy nie jestem w tmuxsesji i odpowiednio dostosować mój monit. Jak dotąd moje na wpół upieczone rozwiązanie .bash_profilewygląda mniej więcej tak:

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

(Sprawdzanie za każdym razem prawdopodobnie nie jest najlepszym podejściem, dlatego jestem otwarty na sugestie, jak to zrobić lepiej. Skrypty Bash nie są moją mocną stroną).

Brant
źródło

Odpowiedzi:

72

Tmux ustawia TMUXzmienną środowiskową w sesjach tmux i ustawia TERMna screen. Nie jest to w 100% wiarygodny wskaźnik (na przykład nie możesz łatwo stwierdzić, czy biegasz w screenśrodku, tmuxczy w tmuxśrodku screen), ale powinien być wystarczająco dobry w praktyce.

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

Jeśli chcesz zintegrować to ze złożonym zestawem monitów za pośrednictwem PROMPT_COMMAND(który, nawiasem mówiąc, jest ustawieniem bash, więc nie powinien być eksportowany):

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

Jeśli kiedykolwiek będziesz musiał sprawdzić, czy tmux jest zainstalowany:

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

Nawiasem mówiąc, to wszystko powinno iść do ~/.bashrc, nie ~/.bash_profile(patrz Różnica między .bashrc i .bash_profile ). ~/.bashrcjest uruchamiany w każdej instancji bash i zawiera dostosowania powłoki, takie jak monity i aliasy. ~/.bash_profilejest uruchamiany podczas logowania (jeśli twoja powłoka logowania jest bash). Co dziwne, bash nie czyta ~/.bashrcw powłokach logowania, więc ~/.bash_profilepowinieneś je zawierać

case $- in *i*) . ~/.bashrc;; esac
Gilles „SO- przestań być zły”
źródło
Istnieje również zmienna alternatywna TMUX_PANE. Zauważyłem tylko, że twój przepis nie zadziałał. Później dowiedziałem się, że niesłusznie użyłem (a następnie unset) zmiennej w skrypcie powłoki, który pozyskuję .profile.
0xC0000022L
[ "$TERM" = "screen" ]może nie działać. W moim przypadku mój ekran zgłaszał się jako screen-256kolorowy.
StevieD
@StevieD Nie sądzę, że tmux robi to samo, ale może to być łatka dystrybucyjna lub konfiguracja.
Gilles „SO- przestań być zły”
2

Po wypróbowaniu różnych sposobów, to ostatecznie działało dla mnie, na wypadek, gdyby to pomogło komukolwiek:

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

W tym fragmencie kodu sprawdzam, czy nie znajdujemy się w środowisku TMUX, uruchamiam go. Jeśli umieścisz ten fragment kodu w swoim .bashrcpliku, automatycznie uruchomisz TMUX za każdym razem, gdy otworzysz terminal! PS: testowane na powłoce Ubuntu.

Alexar
źródło
1

Podobnie jak w przypadku poprzednich odpowiedzi, testowanie ${TERM}zmiennej może prowadzić do przypadków narożnych, tmuxustawia zmienne środowiskowe w swoim życiu:

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

Aby sprawdzić, czy jesteś w tmuxśrodowisku, po prostu sprawdź:

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

iMil
źródło