Як я можу дізнатися, чи перебуваю я в tmux сесії з bash-скрипту?


53

Мені подобається зберігати своє сховищеbash_profile в git та клонувати його до будь-яких машин, до яких я маю доступ до оболонки. Оскільки я tmuxбільшу частину часу маю user@hostрядок у рядку статусу, а не його традиційне місце у запиті оболонки.

Не всі сайти, які я використовую, tmuxвстановлені, але я не завжди можу ним користуватися. Я хотів би виявити, коли я не на tmuxсеансі, і відповідно скоригувати своє запит. Поки що моє напівфабрикат в .bash_profileтакому вигляді виглядає приблизно так:

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

(Перевірка кожного разу, ймовірно, не найкращий підхід, тому я відкритий для пропозицій щодо кращого способу цього. Сценарій Баша - це не моя фортеця.)

Відповіді:


72

Tmux встановлює TMUXзмінну середовища в сесіях tmux і встановлює TERMзначення screen. Це не 100% надійний показник (наприклад, ви не можете легко визначити, бігаєте ви screenвсередину tmuxчи tmuxвсередині screen), але це має бути досить добре на практиці.

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

Якщо вам потрібно інтегрувати це у складний набір запитів через PROMPT_COMMAND(який, до речі, є баш-налаштуванням, тому його не слід експортувати):

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

Якщо вам коли-небудь потрібно перевірити, чи встановлено tmux:

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

До речі, це все повинно входити ~/.bashrc, а не ~/.bash_profile(див. Різниця між .bashrc та .bash_profile ). ~/.bashrcзапускається у кожному екземплярі bash і містить налаштування оболонки, такі як підказки та псевдоніми. ~/.bash_profileзапускається під час входу в систему (якщо оболонка для входу є баш). Як не дивно, bash не читає ~/.bashrcв оболонках для входу, тому ваш ~/.bash_profileповинен містити

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

Існує також альтернативна змінна TMUX_PANE. Я помітив лише тому, що ваш рецепт не працював. Пізніше я з'ясував, що я необґрунтовано використав (і згодом unset) змінну в сценарії оболонки, яку я проглядаю через свою .profile.
0xC0000022L

[ "$TERM" = "screen" ]може не працювати. У моєму випадку мій екран звітував як screen-256колір.
StevieD

@StevieD Я не думаю, що tmux робить це самостійно, але це може бути патч розповсюдження чи конфігурація.
Жил "ТАК - перестань бути злим"

2

Спробувавши різні способи, це в кінцевому підсумку працювало для мене, якщо це допомагає комусь там:

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

У цьому фрагменті коду я перевіряю, чи ми не в середовищі TMUX, і запускаю його. Якщо ви помістите цей фрагмент коду у свій .bashrcфайл, ви автоматично запускаєте TMUX у будь-який час, коли ви відкриєте термінал! PS: тестується на оболонці Ubuntu.


1

Що стосується попередніх відповідей, тестування ${TERM}змінної може призвести до кутових випадків, tmuxвстановлює змінні середовища в межах власного життя:

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / за замовчуванням, 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / imil / .tmux / плагіни /

Щоб перевірити, чи перебуваєте ви в tmuxоточенні, просто перевірте:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.