Как я могу узнать, нахожусь ли я в сеансе tmux из скрипта bash?

54

Мне нравится хранить мой репозиторий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}'

(Проверять каждый раз, вероятно, не лучший подход, поэтому я открыт для предложений по лучшему способу сделать это. Скрипты Bash не моя сильная сторона.)

Казарка
источник

Ответы:

73

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

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

Если вам нужно интегрировать это в сложное приглашение, заданное с помощью PROMPT_COMMAND(кстати, это настройка bash, поэтому не должно экспортироваться):

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). Как ни странно, bash не читает ~/.bashrcв логинах, поэтому ваш файл ~/.bash_profileдолжен содержать

case $- in *i*) . ~/.bashrc;; esac
Жиль "ТАК - перестань быть злым"
источник
Есть и альтернативная переменная TMUX_PANE. Я заметил только потому, что ваш рецепт не сработал. Позже я узнал, что неправильно использовал (и впоследствии unset) переменную в сценарии оболочки, который я использую для поиска .profile.
0xC0000022L
[ "$TERM" = "screen" ]может не работать. В моем случае мой экран был screen-256цветным.
StevieD
@ SteveieD Я не думаю, что 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.

Alexar
источник
1

Как и в предыдущих ответах, тестирование ${TERM}переменной может привести к угловым случаям, tmuxустановив переменные среды в пределах собственной жизни:

$ env | grep -i tmux
TMUX = / TMP / tmux-1000 / по умолчанию, 4199,5
TMUX_PANE = 9%
TMUX_PLUGIN_MANAGER_PATH = / дом / Имиль / .tmux / плагины /

Чтобы проверить, находитесь ли вы внутри tmuxсреды, просто проверьте:

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

IMIL
источник