Como posso saber se estou em uma sessão tmux a partir de um script bash?

53

Eu gosto de manter o meu bash_profileem um repositório git e cloná-lo para todas as máquinas às quais tenho acesso shell. Como estou na tmuxmaior parte do tempo, tenho uma user@hoststring na linha de status, em vez de seu ponto tradicional no prompt do shell.

tmuxPorém, nem todos os sites que eu uso estão instalados, ou talvez nem sempre o esteja usando. Gostaria de detectar quando não estou em uma tmuxsessão e ajustar meu prompt de acordo. Até agora, minha solução semi-assada .bash_profileé mais ou menos assim:

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

(Verificar todas as vezes provavelmente não é a melhor abordagem, por isso estou aberto a sugestões de uma maneira melhor de fazer isso. Os scripts Bash não são o meu forte.)

Brant
fonte

Respostas:

72

O Tmux define a TMUXvariável de ambiente nas sessões tmux e define TERMcomo screen. Este não é um indicador 100% confiável (por exemplo, você não pode dizer com facilidade se está executando screendentro tmuxou tmuxdentro screen), mas na prática deve ser bom o suficiente.

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

Se você precisar integrar isso em um prompt complexo, definido via PROMPT_COMMAND(que é uma configuração do bash, a propósito, não deve ser exportado):

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

Se você precisar testar se o tmux está instalado:

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

A propósito, tudo isso deve entrar ~/.bashrc, não ~/.bash_profile(consulte Diferença entre .bashrc e .bash_profile ). ~/.bashrcé executado em todas as instâncias do bash e contém personalizações de shell, como prompts e aliases. ~/.bash_profileé executado quando você efetua login (se o seu shell de login for bash). Estranhamente, o bash não lê ~/.bashrcshell de login, portanto, você ~/.bash_profiledeve conter

case $- in *i*) . ~/.bashrc;; esac
Gilles 'SO- parar de ser mau'
fonte
Há uma variável alternativa TMUX_PANEtambém. Eu só notei porque sua receita não funcionou. Mais tarde, descobri que havia usado indevidamente (e subseqüentemente unset) uma variável em um shell script que estou procurando no meu .profile.
0xC0000022L
[ "$TERM" = "screen" ]pode não funcionar. No meu caso, minha tela estava relatando em screen-256cores.
StevieD 7/04
@StevieD Eu não acho que o tmux faça isso por conta própria, mas pode ser um patch ou configuração de distribuição.
Gilles 'SO- stop be evil'
2

Depois de tentar maneiras diferentes, é isso que finalmente funcionou para mim, caso ajude alguém por aí:

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

Neste trecho de código, verifico se não estamos no ambiente TMUX, inicio-o. Se você colocar esse trecho de código em seu .bashrcarquivo, você executará o TMUX automaticamente sempre que abrir o terminal! PS: testado no shell do Ubuntu.

Alexar
fonte
1

Quanto às respostas anteriores, testar a ${TERM}variável pode levar a casos extremos, tmuxdefine variáveis ​​de ambiente dentro de sua própria vida:

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

Para verificar se você está dentro de um tmuxambiente, basta verificar:

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

iMil
fonte