A conclusão do bash faz o bash começar devagar

15

Iniciar um bash no meu sistema Ubuntu leva cerca de 2 segundos. Se eu remover o carregamento de / etc / bash_completition no .bashrc, ele será iniciado sem atraso. É 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.

Qualquer ideia de como posso descobrir qual é o problema ou como posso acelerar as coisas.

    
por user75250 07.04.2011 / 13:00

4 respostas

8

Atualização em 2013: a maior parte da conclusão do bash foi reescrita para carregar automaticamente as conclusões somente quando necessário. O roteiro principal é muito mais simples agora.

O script de conclusão pode às vezes ser enorme em padrões de script de shell. Em um dos servidores que eu tenho acesso, são quase 1700 linhas (57 KB) e isso é apenas o script principal . Em /etc/bash_completion.d existem ~ 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 manipuladores de conclusão; ~ 330 vezes neste caso, cada um dos quais envolve a verificação de $PATH para um arquivo executável com um determinado nome. (Embora eu espere que /usr/bin seja armazenado em cache na memória ...)

É verdade que mesmo isso leva apenas meio segundo para carregar, não dois segundos completos. Mas pode ser pelo menos parte do problema. Execute du -hs /etc/bash_completion* ou wc -l /etc/bash_completion{,.d/*} | grep total se quiser verificar.

Você pode tentar manualmente fazer o sourcing do script, no modo "trace":

set -x
. /etc/bash_completion

Você verá cada linha conforme ela é executada. Se houver um comando em particular que demore muito tempo, você deve perceber isso.

( set +x desativa o modo de rastreamento.)

    
por 07.04.2011 / 15:37
13

Encontrei uma solução um tanto hackeada que parece funcionar bastante bem.

Solução

Na parte inferior de ~/.bashrc add:

trap 'source /etc/bash_completion ; trap USR1' USR1
{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown

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 irá carregar as conclusões e, portanto, ele vai se desativar.

{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown

Assincronamente espere um pouco e envie o sinal para o shell atual. disown é necessário para suprimir o feedback de controle do processo bash . sleep é necessário para trabalhar de forma assíncrona.

Problemas

Por alguma razão, o primeiro comando emitido para este shell não será gravado no histórico.

    
por 28.04.2012 / 18:56
6

Você deve usar a versão mais recente (2.0) de bash_completion. Se você está usando o Debian, ele está no wheezy, mas não tem dependências em nenhum outro pacote wheezy, então você pode instalá-lo sem problemas.

A versão mais recente carrega a conclusão dinamicamente em tempo real, então dividiu o tempo de carregamento do prompt para mim em pelo menos 10x.

    
por 02.09.2012 / 22:32
0

Você pode usar um espaço reservado enquanto as conclusões estiverem sendo carregadas; Deve ser o suficiente para enganar seus olhos. Obviamente, isso só funcionará se o tempo necessário por source /etc/bash_completion for menor que o tempo necessário para você digitar e emitir o primeiro comando shell, caso contrário, ele também será atrasado.

A idéia é fazer um eco falso de PS1 , fornecer as conclusões e finalmente ativar o terminal.

Suponha que seu PS1 seja \u@\h:\w\$ , você pode escrever algo como:

echo -ne "$USER@$HOSTNAME:${PWD/$HOME/\~}\$ "
source /etc/bash_completion
echo -ne '\e[2J\e[H'

Onde:

  • 2J apaga o terminal;
  • H move o cursor para o canto superior direito.

Observação: você pode verificar se o usuário é root e usar # em vez de $ para manter a consistência:

echo -ne "...$([ $UID = 0 ] && echo '#' || echo '$') "

Observação: a remoção de \e[2J evita a oscilação, mas deixará os caracteres indesejados se o espaço reservado for maior do que o prompt real.

    
por 25.01.2016 / 18:30