Gostaria que meu shell bash padrão fosse direto para o tmux, em vez de sempre ter que digitar tmux toda vez.
Gostaria que meu shell bash padrão fosse direto para o tmux, em vez de sempre ter que digitar tmux toda vez.
Respostas:
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
TERM
pode ser definida como outro valor pelo .tmux.conf
arquivo do usuário . Melhor verificar se a TMUX
variável está definida ou não.
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
command
para verificar a existência de um comando - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
vez de which
verificar a existência de comandos - https://unix.stackexchange.com/a/85250$PS1
para verificar se há shell interativo - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
Variável esperada do estado da ambiente "para todos os programas em execução no tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
antes, mas não sabia que existia.
exec
declaração não permite sair do tmux sem sair do terminal inteiro! : |
exec
substitui 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 :)
exec tmux
pelo seu gosto preferido detmux attach
exec tmux
usá- exec tmux new-session -A -s main
lo, 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 attach
no caso de não haver sessão disponível (encontrada aqui: unix.stackexchange.com/a/176885/256942 )
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 exit
parte:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Além disso, note que você não deve envolver tmux attach
com exec
, pois isso faria com que a conexão seja fechada quando não há sessões tmux para anexar.
Há um comando chsh
que altera o shell de login. Consulte man chsh
.
tmux
não é um shell, é um multiplexador de terminal como a tela GNU. Curiosamente, ele suporta a -c
opçã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 .
ssh $some_server echo foo
).
/etc/shells
, portanto é um shell de login válido.
default-shell
configuração na configuração do tmux para apontar para um shell real.
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 .bashrc
lugar.
Eu também tentei definir tmux
como 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.
Nenhuma das respostas acima funcionou para mim - me exec tmux
impede de fechar o tmux sem sair do shell (seja aberto com Ctrl
+ T
ou 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
+ B
faz 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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Adicionando à resposta de @Louis Maddox, eu executaria a parte do tmux com;
(exec tmux attach || exec tmux new-session)
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 :)
tmux new -A -s mysession
provavelmente irá funcionar também.
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 TMUX
variável de ambiente estiver desconfigurada / vazia, ainda não estamos em uma sessão tmux, então ...
Se tmux has-session
retornar 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 tmux
como seu shell de login. Se você fizer isso, no entanto, certifique-se de definir default-shell
um shell real no seu ~/.tmux.conf
arquivo (consulte o manual do tmux para obter mais informações sobre isso).
Você pode (e a partir de agora provavelmente deveria) usar o chsh
comando 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.
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:
Adicione isso ao seu ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Como Mikel já afirmou em seu comentário, ter o tmux como seu shell de login pode ter efeitos colaterais. Mas você pode fazer tmux
seu 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/passwd
procure 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.
chsh
faz! Só que o seu caminho exige ser root e é propenso a erros. A execução tmux
de .bash_login
é mais provável que interrompa logins remotos.
[[ $- != *i* ]] && return
a não ser um loop infinito (a partir da mesma página)