Estou tentando definir minha TERM
variável de ambiente para sessões tmux com .tmux.conf
base no valor TERM
herdado do shell pai (que é bash). Observe que tenho a seguinte linha no meu .tmux.conf
para que TERM
seja herdada:
set -g update-environment '...some variables... TERM'
Basicamente, TERM
está xterm-256color
no shell pai, e eu detecto isso e defino a default-terminal
opção usando o seguinte:
if "[[ ${TERM} =~ 256color ]]" 'set -g default-terminal screen-256color'
Essa linha funciona no tmux 1.9a no meu PC de trabalho (RHEL 6.6) e configurada corretamente TERM
como screen-256color
, mas em outros PCs (incluindo um PC Ubuntu no trabalho executando o tmux 1.8 e meu PC Ubuntu doméstico executando o tmux 2.1), o comando 'condição' sempre parece estar retornando falso e TERM
ainda está screen
dentro da nova sessão do tmux.
Eu também tentei fazer if 'true' 'set -g default-terminal screen-256color'
, e também não funcionou! ( TERM
ainda está screen
dentro da nova sessão do tmux).
Alguém poderia me ajudar a descobrir o que estou fazendo de errado? E talvez oferecer algumas informações sobre por que funciona em uma máquina, mas não nas outras duas?
ATUALIZAR:
Depois de executar tmux
com verbosidade extrema ativada ( tmux -vvvvvvvvvv
), acho que entendi o problema.
Olhando para o tmux
arquivo de log do servidor (tmux-server-xxxx.log), vejo as seguintes linhas de log, nesta ordem (com outras linhas entre elas, que omiti):
run job 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955
cmdq 0x55fbca2dc250: new-session (client 7)
session 0 created
job died 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955
Parece que a nova sessão está sendo criadaanteso comando shell sai e, portanto, a opção de sessão não será definida até mais tarde... masésendo definido.
Para confirmar isso, se eu desanexar esta sessão, edite .tmux.conf
para comentar a linha que verifica $TERM
/sets default-terminal
e crie uma nova sessão, essa nova sessão possui TERM = screen-256color
.
No computador RHEL onde o comando está funcionando conforme o esperado, essas linhas de log aparecem em uma ordem diferente:
run job 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
job died 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
cmdq 0x1e66850: new-session (client 7)
session 0 created
...que é o esperado. E TERM
está definido apropriadamente para screen-256color
.
Não estou especificando a -b
opção do if-shell
comando, então não sei por que meu comando parece estar sendo executado em segundo plano nessas duas máquinas Ubuntu. Gostaria de saber se esta é uma possível condição de corrida no tmux?
Responder1
Provavelmente tenho uma resposta para suas perguntas pré-atualização.
Como declaradoaqui:
observe que o tmux usa /bin/sh -c para executar o comando shell que especificamos. Portanto, o comando deve ser compatível com POSIX, portanto, os testes no formato [[ não têm garantia de serem portáveis. Sistemas modernos Ubuntu e Debian, por exemplo, link simbólico /bin/sh para dash.
Essa foi a coisa no meu caso. Tudo funciona depois que substituí o método "seu" pelo seguinte:
if-shell "echo $TERM | grep 256color" 'set -g default-terminal screen-256color'