Por que o preenchimento do bash está sendo carregado tão lento no OS X?

12

Não entendo por que o preenchimento do bash é carregado tão lentamente no meu MacBook Pro.

Eu fiz o seguinte no meu ~/.bash_profile :

echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."

o tempo de execução para bash_completion normalmente é > 2 segundos.

Acho isso muito chato quando estou trabalhando no terminal, o que exige que eu abra constantemente novas abas.

Existe alguma maneira de fazer cache disso ou algo assim?

(Note que estou usando o iTerm2 e isso é igualmente lento no terminal original no Mac também).

    
por disappearedng 15.07.2011 / 21:37

4 respostas

6

Versão resumida: a remoção de uma única linha de /usr/local/etc/bash_completion reduziu o tempo para abrir uma nova guia de dez segundos para um quarto de segundo. Leia para mais detalhes.

Estou usando o bash-completion do homebrew e encontrei o mesmo problema. Levava mais de dez segundos para carregar os scripts de conclusão do bash cada vez que eu abria um terminal.

Na maioria das vezes, parece que é ocupada por uma única linha na função have() : uma chamada para type para determinar se um programa de linha de comando está instalado.

Com a função have() padrão e todos os scripts de conclusão bash fornecidos, seriam necessários 10.561s para carregar os scripts (relatados com o prefixo time à linha . /opt/local/etc/bash_completion no meu arquivo .bash_profile .

Depois de comentar a linha PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null && do meu script /usr/local/etc/bash_completion (deixando a linha have=yes , abrir um novo terminal leva apenas 0,258s. Esse tempo pode ser reduzido ainda mais removendo scripts de conclusão desnecessários (links simbólicos) do /usr/local/etc/bash_completion.d directory.

Eu não sei porque a chamada para type está demorando tanto. Estou investigando isso em seguida.

Uma potencial desvantagem dessa abordagem é que ela fará com que as funções de conclusão do bash sejam carregadas na memória, mesmo que você não tenha nenhum uso para elas. A função have() verifica se um comando ou aplicativo está instalado. Se não for, o script de conclusão geralmente decide não se incomodar em se carregar porque não será útil.

No momento, estou feliz com a troca, mas continuarei a explorar o problema type à medida que eu tiver tempo. Vou atualizar minha resposta se encontrar uma solução melhor.

    
por 14.11.2015 / 02:50
0

Eu tive o mesmo problema. Alguns truques de depuração simples me levaram à causa raiz.

Primeiro, ative o DEBUG mode para ver o que está acontecendo:

  export BASH_COMPLETION_DEBUG=true

Isso permite a impressão detalhada no console, para que você possa ver o último comando. Agora você pode executar o script em segundo plano e você verá o que está acontecendo

   . /opt/local/etc/bash_completion &

Não use o PID , que você pode rastrear com ps ou pstree :

pstree -p <the PID> :

   | |     \-+= 82095 mfellows -bash
   | |       \-+- 82103 mfellows -bash
   | |         |-+- 82104 mfellows cargo --list
   | |         | \--- 82106 mfellows rustc -vV --cap-lints allow

Como você pode ver, começaram alguns comandos relacionados à ferrugem, que estavam demorando séculos.

Remover temporariamente /opt/boxen/homebrew/etc/bash_completion.d/cargo resolveu meus sintomas.

    
por 13.03.2018 / 21:24
-1

Se você estiver executando o MacPorts > = 2.1.2 e o Mountain Lion, parece que seu bash_profile está errado. Siga as instruções em Como obter o git-completion.bash para trabalhar no Mac OS X? . Eu suponho que isso poderia acelerar o preenchimento automático.

Outra solução seria tentar instalar o preenchimento automático via Fink ou Homebrew. Se isso não funcionar, você pode tentar outro shell completamente. Descobri que Fish shell é excelente quando se trata de preenchimento automático (fora da caixa). Embora a versão 2 ainda esteja em versão beta, eu recomendo strongmente.

    
por 27.03.2013 / 13:17
-1

Eu vou adivinhar que sua festa é muito antiga. Estou correndo estoque bash que veio com o Leão da montanha e aqui está o que eu vejo:

$ port info bash-completion
bash-completion @2.0, Revision 1 (sysutils)

Description:          Programmable completion library for bash. This port
                      **requires bash >=4.1** and is meant to be used together with
                      the bash port.
Homepage:             http://bash-completion.alioth.debian.org/

Runtime Dependencies: bash
Conflicts with:       bash-completion-devel
Platforms:            darwin
License:              GPL-2+
Maintainers:          [email protected]

$ bash --version
GNU bash, version **3.2.48(1)-release (x86_64-apple-darwin12)**
Copyright (C) 2007 Free Software Foundation, Inc.
    
por 04.04.2013 / 06:56

Tags