Como posso configurar meu shell padrão para iniciar o tmux

79

Gostaria que meu shell bash padrão fosse direto para o tmux, em vez de sempre ter que digitar tmux toda vez.

Michael Durrant
fonte

Respostas:

46

Isso parece funcionar ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Basta adicionar a seguinte linha de código bash ao seu .bashrc antes dos seus aliases; o código para outras conchas é muito semelhante:

[[ $TERM != "screen" ]] && exec tmux
StarNamer
fonte
2
Para mim, isso também exigiu [[ $- != *i* ]] && returna não ser um loop infinito (a partir da mesma página)
Keith Smiley
5
Esta é uma solução ruim, pois TERMpode ser definida como outro valor pelo .tmux.confarquivo do usuário . Melhor verificar se a TMUXvariável está definida ou não.
Kusalananda
104

A resposta do @ StarNamer é geralmente precisa, embora eu normalmente inclua os seguintes testes para garantir que (1) o tmux exista no sistema, (2) estamos em um shell interativo e (3) o tmux não tente executar dentro em si:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Referências

user7089
fonte
1
Bom, eu precisava commandantes, mas não sabia que existia.
precisa
2
esta execdeclaração não permite sair do tmux sem sair do terminal inteiro! : |
Louis Maddox
5
@LouisMaddox: execsubstitui o atual processo com um novo - neste caso, ele substitui o shell de login do bash com tmux, então quando tmux sai então não há outro terminal para voltar a cair para :)
Mark K Cowan
1
@rjt Está correto, isso inicia uma nova sessão por design. Se você preferir se conectar a uma sessão existente do tmux, substitua-o exec tmuxpelo seu gosto preferido detmux attach
user7089
2
em vez de exec tmuxusá- exec tmux new-session -A -s mainlo, sempre terei uma sessão chamada principal e anexarei a ela (em vez de criar uma nova sempre que me conectar à minha máquina remota), mas ela não funcionará como tmux attachno caso de não haver sessão disponível (encontrada aqui: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid
16

Adicionando uma linha como

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

no seu arquivo bashrc provavelmente fará o trabalho. Observe que esta linha sairá do ssh e encerrará a conexão quando você desconectar ou sair do tmux. Eu gosto dessa configuração, pois salva as teclas pressionadas para finalizar a conexão. Mas se você não gosta disso (o que acho improvável) e prefere permanecer no shell de login após o término, remova a exitparte:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

Além disso, note que você não deve envolver tmux attachcom exec, pois isso faria com que a conexão seja fechada quando não há sessões tmux para anexar.

huangzonghao
fonte
Adicionei esta linha ao meu .bashrc, mas agora, quando inicio um terminal, recebo algumas mensagens: /home/z/.tmux.conf:10: nenhuma sessão atual (a mensagem se repete nas linhas 11, 13, 14 15). Essas linhas são coisas como "set default-command" exec bash "" e "set default-terminal" screen-256color ".
Matt G
@ MattG Parece que há algo errado com o arquivo de configuração do tmux.
huangzonghao 03/02
5

Há um comando chshque altera o shell de login. Consulte man chsh.

Paulo
fonte
6
tmuxnão é um shell, é um multiplexador de terminal como a tela GNU. Curiosamente, ele suporta a -copção de acordo com a página de manual , portanto, pode funcionar como um shell apenas o suficiente para usá-lo como seu shell de login, mas suspeito que não funcionará corretamente em todas as situações, por exemplo, logins gráficos via gdm / kdm .
22612 Mikel
1
Embora isso seja sensato e apoiado pela documentação, parece interromper a execução direta de comandos via SSH (algo como ssh $some_server echo foo).
n.st
3
O tmux a partir de pelo menos 1,8 no Ubuntu se adiciona /etc/shells, portanto é um shell de login válido.
claytron
2
Isso requer que você defina a default-shellconfiguração na configuração do tmux para apontar para um shell real.
Kusalananda
4

Estou usando com sucesso

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

no meu .zshrc. Se você estiver usando o bash, coloque-o no seu .bashrclugar.


Eu também tentei definir tmuxcomo meu shell padrão ( chsh -s $(which tmux)) e parece interromper a execução direta de comandos via SSH, por exemplo ssh $some_server echo foo, não produzirá nenhuma saída.

n.st
fonte
3

Vá para preferências do terminal. insira a descrição da imagem aqui

E, em seguida, clique na barra de "comando". insira a descrição da imagem aqui

Marque a opção "Executar um comando personalizado em vez da minha venda" e escreva o comando que deseja executar na inicialização do seu terminal.

user174935
fonte
1

Nenhuma das respostas acima funcionou para mim - me exec tmuximpede de fechar o tmux sem sair do shell (seja aberto com Ctrl+ Tou no menu do aplicativo).

Eu uso o Linux Mint, que permite mapear certas teclas de atalho para comandos e (por mais que seja para alguns ..) eu tenho shells bash com comandos iniciando lá em cima, por exemplo, Win+ Alt+ Bfaz algum tipo de bash -exec(vim)declaração complicada para edite meu .bashrc, para que ele funcione como um shell comum.

O tmux foi carregado em vez do vim nessa situação depois de colocar o item acima no topo do meu .bashrc. Embrulhei a linha de execução do tmux em outra instrução if, verificando se ela está sendo executada no modo interativo.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

Você pode agrupar tudo isso em uma linha, mas, para facilitar a leitura, acho que está bem.

Louis Maddox
fonte
Adicionar um e comercial resolveria esse problema dessa maneira. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau
1

Adicionando à resposta de @Louis Maddox, eu executaria a parte do tmux com;

(exec tmux attach || exec tmux new-session)
devrimbaris
fonte
Eu uso exec sh -c 'tmux a || tmux', o que (depois de analisar sua resposta) provavelmente fará com que coisas ruins aconteçam se o tmux não puder iniciar por qualquer motivo ..... obrigado, vou usar o seu a partir de agora :)
Mark K Cowan
1
tmux new -A -s mysessionprovavelmente irá funcionar também.
Pool #
1

Isto está no meu ~/.profile(eu estou usando ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Se a TMUXvariável de ambiente estiver desconfigurada / vazia, ainda não estamos em uma sessão tmux, então ...

Se tmux has-sessionretornar com um status de saída zero (true), há uma sessão disponível para anexar. Anexar a ele.

Caso contrário, crie uma nova sessão.

Também é possível usar tmuxcomo seu shell de login. Se você fizer isso, no entanto, certifique-se de definir default-shellum shell real no seu ~/.tmux.confarquivo (consulte o manual do tmux para obter mais informações sobre isso).

Kusalananda
fonte
1

Você pode (e a partir de agora provavelmente deveria) usar o chshcomando para definir o tmux como shell padrão e adicionar o seguinte a .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Lembre-se de modificar o caminho no final da linha.

Błażej Michalik
fonte
1

Combinei as verificações extensivas, com a verificação condicional da sessão, e coloquei minha própria rotação para criar uma sessão padrão conectada ou criada. A menos que você esteja dentro de outra sessão do tmux ou outras condições de proteção sejam atendidas.

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

Com base nestas respostas:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

yosefrow
fonte
0

Adicione isso ao seu ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
fonte
1
Eu acho que você não entendeu a pergunta, cara! ;)
PhilT
-3

Como Mikel já afirmou em seu comentário, ter o tmux como seu shell de login pode ter efeitos colaterais. Mas você pode fazer tmuxseu shell padrão, literalmente. O shell padrão de um usuário é definido em / etc / passwd. Então você pode se tornar root e editar / etc / passwd, por exemplo, sudo vi /etc/passwdprocure a linha que começa com seu nome de usuário. Provavelmente termina com :/bin/bash. Altere / bin / bash para / usr / bin / tmux e agora tmux é seu shell de login padrão.

No entanto, não há garantia de que isso não cause problemas!

O que pode funcionar melhor é NÃO fazer nada que requeira privilégios de root. Eu tentaria criar um arquivo em meu diretório pessoal chamado .bash_login e iniciar o tmux dentro desse arquivo: `echo" tmux "> ~ / .bash_login.

Isso deve funcionar, mas você precisa tentar descobrir a si mesmo, porque a documentação do bash não é muito exata sobre qual arquivo é lido e executado quando.

Bananguin
fonte
2
O que seu primeiro parágrafo descreve é ​​o que chshfaz! Só que o seu caminho exige ser root e é propenso a erros. A execução tmuxde .bash_loginé mais provável que interrompa logins remotos.
Gilles