Iniciar uma festança no meu sistema ubuntu leva cerca de 2 segundos. Se eu remover o carregamento / etc / bash_completition no .bashrc, ele iniciará sem demora. Claro que não quero desistir da conclusão e não acho que carregar esse arquivo seja motivo legítimo para um atraso de 2 segundos.
Alguma idéia de como posso descobrir qual é o problema ou como posso acelerar as coisas.
ubuntu
performance
bashrc
tab-completion
user75250
fonte
fonte
Respostas:
Atualização em 2013: a maior parte da conclusão do bash foi reescrita para carregar automaticamente conclusões apenas quando necessário. O script principal é muito mais ligeiro agora.
Às vezes, o script de conclusão pode ser enorme nos padrões de script de shell. Nos servidores em que tenho acesso, são quase 1700 linhas (57 KB) e esse é apenas o script principal . Em
/etc/bash_completion.d
há ~ 200 scripts adicionais para vários outros comandos (openssl
,mutt
,mount
...) totalizando 25537 linhas ou 1.2 MB. Cada script, quando originado, verifica se um comando está realmente disponível antes de definir os manipuladores de conclusão; ~ 330 vezes neste caso, cada uma das quais envolve a verificação$PATH
de um arquivo executável com um determinado nome. (Embora eu esperasse/usr/bin
ser armazenado em cache na memória ...)É certo que mesmo isso leva apenas meio segundo para carregar, e não dois segundos completos. Mas pode ser pelo menos parte do problema. Execute
du -hs /etc/bash_completion*
ouwc -l /etc/bash_completion{,.d/*} | grep total
se você deseja verificar.Você pode tentar obter o script manualmente, no modo "rastreio":
Você verá cada linha conforme é executada. Se houver um comando específico que leva muito tempo, você deve notá-lo.
(
set +x
desativa o modo de rastreamento.)fonte
Eu encontrei uma solução um pouco hackiana que parece funcionar bastante.
Solução
Na parte inferior do
~/.bashrc
add:Explicação
trap 'source /etc/bash_completion ; trap USR1' USR1
Configure um manipulador para ser executado quando o shell receber o sinal
SIGUSR1
; o manipulador carregará as conclusões e, portanto, será desativado.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown
Aguarde um pouco de forma assíncrona e depois envie o sinal para o shell atual.
disown
é necessário para suprimir obash
feedback do controle do processo.sleep
é necessário para trabalhar de forma assíncrona.Problemas
Por alguma razão, o primeiro comando emitido para esse shell não será registrado no histórico.
fonte
time bash -lc true
relata ~ 0,12s com ou sem isso, apesar detime source /etc/bash_completion
relatar números mais altos como 0,26s. Isso foi efetivamente corrigido ?time bash -lc true
funciona corretamente aqui, poistrue
termina antes,~0.1s
para que não obtenha nada. De qualquer forma,time source /etc/bash_completion
relata ~ 0,17s aqui e é sobre o tempo que eu preciso esperar pelaPS1
aparição.USR1
no final.Você deve usar a versão mais recente (2.0) do bash_completion. Se você estiver usando o Debian, ele está no wheezy, mas não depende de nenhum outro pacote wheezy, portanto você pode instalá-lo rapidamente e sem problemas.
A versão mais recente carrega a conclusão dinamicamente em tempo real, por isso dividiu o tempo de carregamento rápido para mim em pelo menos 10x.
fonte
Você pode usar um espaço reservado enquanto as conclusões estão sendo carregadas; deve ser o suficiente para enganar seus olhos. Obviamente, isso funcionará apenas se o tempo necessário
source /etc/bash_completion
for menor que o tempo necessário para você digitar e emitir o primeiro comando do shell, caso contrário também será atrasado.A idéia é ecoar uma farsa
PS1
, obter as conclusões e finalmente eliminar o terminal.Suponha que você
PS1
seja\u@\h:\w\$
, eles podem escrever algo como:Onde:
2J
apaga o terminal;H
mova o cursor para o canto superior direito.Nota: convém verificar se o usuário é root e usa em
#
vez de$
obter consistência:Nota: A remoção
\e[2J
evita a tremulação, mas deixa caracteres indesejados se o espaço reservado for maior que o prompt real.fonte