Como aplicar a digitação antecipada à pesquisa do histórico bash (Ctrl-R)?

6

Contexto

Typeahead no bash: good

Quando um shell bash está ocupado (inicializando, executando um comando), pode-se digitar antes do próximo prompt aparecer .

Se o shell tiver lançado um programa, esse programa capturará as chaves, mas se nenhum programa for executado ou se o programa não capturar a entrada, o tipo inserido será inserido após o prompt aparecer.

Por exemplo: digite sleep 5 , pressione Enter, digite ls e pressione Enter. ls será executado após o término do sono. Na vida real, ls seria substituído por cp , rsync ou muitos outros programas. Esse é um recurso típico do Typeahead e economiza muito tempo quando você sabe com antecedência o que digitar.

Também é muito bom, pois permite copiar e colar vários comandos e executá-los em sequência.

Caso de uso do mundo real inclui quando o shell leva tempo para inicializar. Pode ser que o computador esteja lento por algum motivo, ou o shell está em um link de rede lento, etc.

Pesquisa de histórico no bash: good

Em um prompt bash, pode-se digitar Ctrl-R para pesquisar no histórico.

Esta é uma poupança de tempo inestimável ao reutilizar algumas linhas de comando antigas ou até mesmo a sequência de linhas de comando. Pressione Ctrl-R , digite alguns caracteres típicos do comando para procurar, pressione Ctrl-O quantas vezes forem necessárias para reproduzir os comandos gravados a partir daí.

Typeahead na pesquisa de histórico: como?

Existe uma limitação, no entanto. Muitas vezes eu uso a seqüência acima e descubro que, se eu digitar, por exemplo Ctrl-R ls antes que o prompt do shell tenha aparecido, a parte Ctrl-R é ignorada, mas a parte ls é mostrada.

O efeito líquido é que é preciso esperar que o prompt do shell apareça antes de digitar Ctrl-R , derrotando parte do tempo economizado.

Pergunta

Existe uma maneira de ter Ctrl-R honrado mesmo em uma situação típica?

    
por Stéphane Gourichon 31.08.2015 / 11:37

1 resposta

11

Sua Ctrl - r está sendo interceptada pelo mecanismo de processamento de linha de terminal do kernel.

Enquanto sleep está em execução, o terminal está no modo cozido, o que significa que o editor de linha tty baseado em kernel está funcionando. O editor de linha tty suporta edição de linha de comando rudimentar. A tecla de apagamento (geralmente definida como Ctrl - h (backspace) ou Del ) e a tecla kill (usualmente Ctrl-U ) são as teclas de edição especial mais conhecidas que podem ser usadas neste modo. Este editor de linhas é útil: é o que permite que utilitários interativos que não usam readline nem curses leiam linhas completas de entrada do terminal, permitindo que o usuário faça correções de digitação.

Mas há outra chave especial ativa nesse modo. Você pode vê-lo junto com as outras configurações chave na saída de stty -a sob o nome rprnt e sua configuração padrão é ... você adivinhou ... Ctrl - r . A função dessa chave é repintar a linha de comando atual, caso ela tenha sido corrompida ou desalinhada devido a outra saída de terminal.

Para evitar isso, você pode desativar a função com stty rprnt undef .

Pessoalmente, estou acostumado a Ctrl - r ser interpretado como um comando repaint e fico surpreso toda vez que tento fazer isso em bash e ele faz algo diferente!

    
por 31.08.2015 / 12:19