Console virtual TTY + tmux: parece que o ~ / .bashrc está sendo executado mais de uma vez?

3

Eu prefiro usar o tmux em vez do console virtual linux padrão (ou seja, o que o agetty usa), então coloquei em ~/.bashrc para que o tmux seja executado automaticamente quando eu fizer login em um TTY:

if [[ "$(tty)" == /dev/tty* ]]; then
    tmux -u
fi

A princípio, parece que isso funciona: o tmux é executado assim que eu faço o login. No entanto, quando eu sair do tmux, o tmux é executado imediatamente uma segunda vez! Aqui está o comportamento completo:

  • ctrl + alt + f2
  • Fazer login
  • Prompt padrão brevemente visível antes de o tmux ser executado
  • estou em tmux
  • ctrl + d
  • O texto [exited] pisca brevemente e, em seguida, volto a tmux
  • ctrl + d
  • Voltar no terminal padrão sem tmux
  • ctrl + d
  • Agora estou completamente desconectado

Não consigo rastrear isso - tentei registrar todos os tipos de coisas, configurando variáveis de ambiente, observando $SHLVL . Na verdade, parece que .bashrc é executado como 7 vezes cada vez que eu faço login!

Eu normalmente não uso o tmux de dentro do X (eu apenas uso o Konsole), mas eu tentei configurar o bashrc para que o tmux fosse executado para todas as sessões não-tmux, e esse comportamento duplo não aconteceu em Konsole.

Estou usando:

  • Arch Linux (4.8.13-1)
  • agetty
  • tmux
  • Bashish
  • full ~/.bashrc e outras configurações (sem ~/.bash_profile file): link (tentei remover o material bashish, mas o comportamento permaneceu)

O que pode estar causando isso?

    
por tobek 08.01.2017 / 02:56

1 resposta

2

Correção nº 1:

Não foi possível rastreá-lo, mas consertamos corrigir isso com a seguinte invasão no meu ~/.bashrc :

if [ -z "$user_bashrc_already_run" ]; then
    user_bashrc_already_run=1
else
    return
fi

Correção nº 2:

Gerenciado para rastrear isso corretamente. Como o TTY é um shell de login interativo, ele estava executando /etc/profile e ~/.profile (o emulador de terminal no X não carrega nenhum deles, pois não é um shell de login). No meu caso (e eu não tenho idéia do porquê, talvez a instalação do Bashish ou qualquer outra coisa) esses arquivos eram idênticos, e ambos fonte todos os scripts em /etc/profile.d , que no meu caso incluiu um script que fontes ~/.bashrc . >

Remover todo o código duplicado de ~/.profile resolveu o problema.

Lendo a seção "Invocação" de man bash e perguntas como link são úteis.

Caso alguém venha aqui com um problema semelhante, aqui está uma maneira melhor de executar o tmux, porque ele faz com que o shell seja substituído pelo tmux em vez de executar o tmux como um sub shell:

if command -v tmux>/dev/null; then # check if tmux command exists
    if [[ "$(tty)" =~ /dev/tty ]] && [[ ! "$TERM" =~ screen ]] && [ -z "$TMUX" ]; then
        # We're on a TTY and *not* in tmux
        exec tmux -u
    fi
fi

E eu decidi colocar isso no meu ~/.profile porque eu quero que ele seja executado em shells de login, não em shells de não-login. (Observe que, se você tiver ~/.bash_profile , o bash executará isso em vez de ~/.profile .)

    
por 08.01.2017 / 03:20