Pesquisa no histórico do Bash, parcial + seta para cima

146

Eu procurei, mas não encontrei nada sobre isso. Estou procurando uma funcionalidade no bash, usando um terminal.

Na época, eu tinha um usuário em um sistema debian e um amigo me configurou com um recurso conveniente de pesquisa de histórico (acredito que usei o tcsh na época), onde digitava o início de um comando anterior, pressionava a seta para cima, e faria uma pesquisa, com base na string parcial.

Por exemplo, se minha história é:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

E eu digite .e pressione seta para cima, ele iria me mostrar: ./script.pl arg1. Pressione novamente e mostrará ./script.pl, etc.

Muito parecido com um grep.bash_history. Existe uma maneira de obter essa funcionalidade?

TLP
fonte
possível duplicata de ipython Como Comando History Para Shell
Marcel Stimberg
11
@ Marcel Parece que pode ser a mesma resposta, vi isso na pesquisa, mas não o vinculei à minha pergunta, com as palavras-chave iPython e Shell.
TLP

Respostas:

197

Coloque as seguintes linhas no seu ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

As linhas que começam com #são comentários. Não me lembro o que é atrasado e o que encaminhar. Experimente com isso. Talvez você precise mudar para trás e para frente.


Um pouco de informações básicas:

O Bash está usando o readline para lidar com o prompt. ~/.inputrcé o arquivo de configuração para o readline. Observe que isso também terá efeito em outro software usando a biblioteca readline, por exemplo, IPython .

Leia o manual do bash para obter mais informações sobre o readline. Lá você também pode encontrar mais comandos readline relacionados ao histórico .

Para obter os códigos de escape das teclas de seta, você pode fazer o seguinte:

  1. Comece catem um terminal (apenas cat, sem mais argumentos).
  2. Digite as teclas do teclado, você terá coisas como ^[[Aseta para cima e seta ^[[Bpara baixo.
  3. Substitua ^[por \e.
lesmana
fonte
11
Ótimo, mas esta solução desativa os atalhos ctrl-left / ctrl-right.
Eyal
Alguém pode me dizer como eu posso conseguir o mesmo para make
Hitesh Kumar
@lesmana, eu daria pontos extras apenas pela parte do gato #
Mike D
Posicionando @Eyal, alguém tem conselhos sobre como eu posso ter isso, mas preservo os atalhos ctrl-left / ctrl-right?
Kbrose # 28/18
6
Para preservar todos os padrões $include /etc/inputrc, adicione , de preferência na primeira linha.
Tulio Casagrande
31

Crie um arquivo chamado setup_readline.sh com o modo 644 em /etc/profile.d/ com o seguinte conteúdo, faça o login e verifique suas chaves preferidas:

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Eu acho que é a melhor maneira de fazer isso. Principalmente se você estiver usando sistemas de gerenciamento de configuração, como chef, fantoche, etc.

E configuração do sistema ainda intocada!

user287613
fonte
4
Estranhamente, o ~ / inputrc não funcionou para mim - mas colocar esses comandos em .bash_profile funcionou.
Joe
11
O .inputrc não existe na minha pasta pessoal e eu prefiro ter esse tipo de configuração no .bashrc de qualquer maneira, para que eu possa carregar apenas um arquivo para as minhas configurações. Portanto, esta é provavelmente uma resposta melhor que a aceita.
Shital Shah
.inputrc funciona fabulosamente para mim, mas não depois que eu carrego screen. O estranho é que outros atalhos .inputrc funcionam, mas não esses. Então, eu uso as duas soluções agora.
Orwellophile
Isso é super útil quando, por exemplo, você se conecta a um servidor para fazer as coisas e sente falta delas e não deseja editar e recarregar o ~ / .inputrc no servidor.
precisa saber é o seguinte
13

Ctrl + R fornecerá esse tipo de funcionalidade. Comece a digitar um comando parcial e ele aparecerá com os antigos que você pode navegar com as setas para cima e para baixo. Mais informações: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell

Andrew Moss
fonte
2
Obrigado pela sua resposta. Sim, eu tentei isso, mas acho um pouco ... mimado. Não me permitirá percorrer os comandos que começam com o parcial, mas apenas o primeiro. Ele também procura em todo o comando o personagem, que é meio inútil.
TLP
5
@TLP, repetição de batidasCtrl+r
akostadinov
4

Para concluir a resposta da lesmana sobre "~ / .inputrc" que devo criar no meu Trusty 14.04, verifique / adicione "~ / .bashrc" (a primeira linha já existe no meu "~ / .bashrc"):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Já foi explicado em francês em https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .

bcag2
fonte
2
Este comando basicamente instrui o bash a anexar imediatamente o comando ao arquivo de histórico, em vez de aguardar o término da sessão. É útil se você tiver muitos terminais abertos e não quiser perder histórico em um, mas não for necessário. digitalocean.com/community/tutorials/…
Shital Shah 4/16/16
3

Talvez você queira tentar https://github.com/dvorka/hstr, que fornece uma filtragem simples e simples de várias linhas do histórico do Bash que, com base em métricas (quando, com que frequência e tamanho dos comandos importa) - você pode usar teclas de seta para navegar facilmente pelo histórico:

insira a descrição da imagem aqui

Ele pode ser facilmente ligado a Ctrl-re / ouCtrl-s

Martin Dvorak
fonte
0

A solução a seguir combina e estende algumas das abordagens mencionadas acima: adicione as seguintes linhas ao seu ~/.bash_aliasesarquivo (não é necessário ~/.inputrc) para obter o seguinte comportamento:

  1. mova para cima / para baixo no histórico (apenas entradas com o mesmo prefixo) pressionando CTRL + UP e CTRL + DOWN. Isso pode coexistir com a funcionalidade padrão de mover para cima / para baixo no histórico completo, apenas por cima e por baixo
  2. pule para a palavra seguinte / anterior em uma linha de comando pressionando CTRL + RIGHT e CTRL + ESQUERDA
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Faça login novamente no shell (ou execute source ./bash_aliases) para aplicar as alterações.

user27164
fonte