O que faz com que o bash pause após um comando incorreto?

23

Quando você estiver digitando um comando incorreto, diga que deseja:

$ cd ..
$ ls

Mas, em vez disso, você digita muito rápido e acaba pressionando enter entre l e s, para obter:

$ cd ..
$ l
sbash: l: command not found...

Isso acontece o tempo todo, é claro, quando digitamos rápido. O que me interessa é a origem da pausa de 2,5 segundos (no meu sistema) depois que o texto de comando incorreto aparece na tela. Parece-me que reconhece o comando incorreto instantaneamente, imprime uma mensagem de erro sobre ele, mas apenas por diversão aguarda 2,5 segundos antes de me retornar à linha de comando. O que causa isso? Existe uma maneira de corrigir isso? É um pequeno aborrecimento, mas eu gostaria de me livrar dele. :)

Edit: Executando o sistema Fedora 16

Fuu
fonte
Você esqueceu de mencionar em qual sistema operacional está.
Daniel Beck
whoa, você não alias l a ls? :)
dotjoe

Respostas:

42

Esse tipo de comportamento é causado por uma ferramenta frequentemente instalada em algumas distribuições que se conectam ao bash. Esse gancho faz com que, se você tentar executar um comando, e o comando não existir, o bash procurará os arquivos disponíveis nos repositórios configurados e informará o pacote que você precisa instalar para obter esse comando.

Se você não estiver em um sistema Debian, deverá examinar os perfis dos arquivos de inicialização do bash e assim por diante e ver se alguma coisa define a função nomeada command_not_found_handle. Se essa função bash estiver definida, ela será chamada sempre que você executar um comando e um programa apropriado não puder ser encontrado no seu caminho de pesquisa. Se você executar typset | lesse navegar pela saída, verá a command_not_found_handle()função se ela tiver sido definida.

No Debian / Ubuntu, o pacote que fornece esse comportamento é um comando não encontrado . Se você limpar isso, desabilitará as pesquisas que atrasam as coisas.

Aqui está um exemplo

# command-not-found installed
$ time pwgen
The program 'pwgen' is currently not installed.  To run 'pwgen' please ask your administrator to install the package 'pwgen'
pwgen: command not found

real    0m0.074s
user    0m0.032s
sys     0m0.040s

# purge command-not-found and restart bash
$ time pwgen
-bash: pwgen: command not found

real    0m0.002s
user    0m0.000s
sys     0m0.000s

A hora exata seria, obviamente, diferente para você. Eu executei meus testes em um servidor bastante robusto.

Zoredache
fonte
10
No meu caso no fedora, ele acabou sendo um pacote chamado: PackageKit-command-not-found
Fuu
6

Parte da questão era "existe uma maneira de corrigir isso (no Fedora)?" Existe: na parte inferior do seu arquivo .bashrc, adicione o comando

unset command_not_found_handle

Você provavelmente deseja fazê-lo no final do seu .bashrc (ou próximo a ele) porque pode estar executando o / etc / bashrc ou outros scripts bash na parte superior do seu .bashrc.

Scott C Wilson
fonte
5

No fedora, esse comportamento pode ser controlado alterando o /etc/PackageKit/CommandNotFound.confarquivo de configuração.

A configuração SoftwareSourceSearch=falseeliminará o atraso, pois não tentará localizar um pacote com o comando ausente usando o gerenciador de pacotes.

Você também pode alterar a quantidade de tempo que aguardará uma pesquisa de pacote, alterando a MaxSearchTime=2000opção para indicar o número de milissegundos que você deseja aguardar que a pesquisa de pacote retorne uma correspondência. Acho que o padrão de 2 segundos não é longo o suficiente para retornar quaisquer correspondências e apenas causa um atraso indesejado quando você digita um erro de digitação.

Aumente o número MaxSearchTimepara fornecer uma saída útil ou desative SoftwareSourceSearchpara eliminar completamente o atraso.

Aner
fonte