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

45

Eu gosto de manter meu bash_profile em um repositório git e cloná-lo em qualquer máquina que eu tenha acesso ao shell. Como estou em tmux na maior parte do tempo, tenho uma string user@host na linha de status, em vez de seu ponto tradicional no prompt do shell.

Nem todos os sites que eu uso têm tmux instalado ou nem sempre posso usá-lo. Gostaria de detectar quando não estou em uma sessão tmux e ajustar meu prompt de acordo. Até agora, minha solução incompleta em .bash_profile é algo como isto:

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

(Verificar cada vez, provavelmente, não é a melhor abordagem, por isso estou aberto a sugestões para uma melhor maneira de fazer isso. Bash script não é o meu strong.)

    
por Brant 05.04.2011 / 22:32

3 respostas

62

Tmux define a variável de ambiente TMUX em sessões tmux e define TERM to screen . Este não é um indicador 100% confiável (por exemplo, você não pode dizer facilmente se está executando screen dentro de tmux ou tmux dentro de screen ), mas deve ser bom o suficiente na prática.

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

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

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, isso deve entrar em ~/.bashrc , não ~/.bash_profile (veja 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 é bash). Estranhamente, o bash não lê ~/.bashrc em shells de login, então seu ~/.bash_profile deve conter

case $- in *i*) . ~/.bashrc;; esac
    
por 05.04.2011 / 22:41
1

Depois de tentar maneiras diferentes, isso é o que basicamente funcionou para mim, no caso de ajudar alguém a sair:

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, eu verifico se não estamos no ambiente TMUX, eu o inicio. Se você colocar este snippet de código no seu arquivo .bashrc , você executará automaticamente o TMUX sempre que abrir o terminal! P.S .: testado no shell do Ubuntu.

    
por 13.12.2017 / 00:46
0

Como nas respostas anteriores, o teste da variável ${TERM} poderia levar a casos de canto, tmux define variáveis de ambiente dentro de sua própria vida:

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

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

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

    
por 26.10.2018 / 10:55