Melhor maneira de pesquisar o histórico do shell

78

Existe uma maneira melhor de procurar um comando no meu arquivo de histórico do que o grep? Eu tenho alguma idéia de como o comando começa, mas não sei até que ponto a história está lá.

update: anteriormente era específico do zsh, mas devido a respostas sobrepostas, sinta-se à vontade para responder a qualquer shell (ou modo (vi / emacs)) aqui, observe se é específico.

xenoterracida
fonte

Respostas:

73

Ctrl+ Rgeralmente é a melhor maneira, como o descritor disse . Você também pode usar !string, que executa o comando mais recente começando com string, ou !?string?, que executa o comando mais recente que contém string.

(Eu acho que esse é o único material relevante para esta pergunta, mas eu cobri muito mais dos comandos de história nesta resposta )

Michael Mrozek
fonte
4
como você faz o 'ctrl + r' ficar assim?
Xenoterracide
13
@xen <kbd>Ctrl+R</kbd>. fonte da resposta
Michael Mrozek
Eu não sabia que o mecanismo SE aceitou qualquer agradecimento em html.
Xenoterracide
Eu não sabia que a palavra-chave kbd interpretaria corretamente o "ctrl" e o "+"! Eu costumava marcar cada tecla separadamente. obrigado!
Olivier Dulac
2
@OlivierDulac Infelizmente, não é assim que eu costumava formatar chaves; alguém editou a minha resposta mais tarde para torná-los chaves separadas
Michael Mrozek
30

Ao usar o Bash, digite Control- Re comece a digitar. Digitação Control- Rrepetidamente após a inserção de algum texto, você retornará às linhas de comando correspondentes.

Grendel
fonte
18

Não tenho certeza se isso vai ajudar, mas eu gosto de usar ctrl- re comece a digitar o comando. Ele deve passar por sua história e apresentar a primeira partida. Para alternar entre as partidas, basta pressionar ctrl- rnovamente.

descritor
fonte
2
Desculpe, esqueci o zsh. Você pode ter que adicionar esta combinação de teclas ao seu ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
decriptor
17

Se você adicionar o seguinte a ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

e reinicie o Bash, você pode começar a digitar e, em seguida, usar Page Upe Page Downpara retroceder e avançar no histórico de linhas começando com o mesmo prefixo digitado.

(Alguns podem preferir usar \e[Ae \e[B, que substituirá o normal Upe as Downações, em vez de vincular novas chaves.)

efémero
fonte
Eu prefiro mapear esses comandos para Alt + Upe Alt + Down. Dependendo da emulação do teclado, o emulador de terminal usa essas combinações que podem ser mapeadas para \E[Ae \E[A(por exemplo, KDE Konsole com Linux Key Bindings) ou \E[1;3Ae \E[1;3B(por exemplo, XFCE Terminal ou KDE Konsole com X Free 4 Bindings).
Christian Herenz
9

O prompt interativo invocado por Ctrl- R, que já havia sido mencionado, é a maneira mais conveniente. Além disso, é popular remapear Upe Downas teclas de seta para pesquisar no histórico um prefixo atualmente na linha de comando, no entanto, isso requer algumas alterações no ~/.inputrcarquivo .

A solução clássica e menos interativa é usar a expansão do histórico do shell. Digitando

!foo

irá executar o último comando que começa com fooe

!?foo

irá executar o último comando que contém foo. Mais informações sobre a expansão do histórico podem ser encontradas no manual de referência do Bash , supondo que seu shell seja Bash ou compatível.

Adam Byrtek
fonte
6

Se você adicionar stty -ixonao seu ~/.bashrcarquivo, então Ctrl- sirá na direção oposta a Ctrl- r.

Dennis Williamson
fonte
Eu queria usar C-spara esse fim, mas meu terminal ficou congelado ; cuidado! (Bem, eu ainda não empregou qualquer stty ixon, não sei o que isso é para.)
IMZ - Ivan Zakharyaschev
3
@imz: C-qirá "descongelar". Ele e C-ssão os caracteres de controlo de fluxo de software habituais que já foram úteis para interromper manualmente (pausa) o fluxo de saída, quando foram usadas as ligações em série lentas. Agora, a saída é tão rápida na maioria dos casos que o que você deseja ver quando pressiona C-sjá rolou. stty -ixondesativa o controle de fluxo do software.
Dennis Williamson
Fantástico! Tenho procurado por anos uma maneira de avançar na história como esta.
marlar 31/12/16
3

Se você digitar !ls, o bash examinará seu histórico e executará o comando mais recente que começa com "ls"

Kevin M
fonte
2

pode ser específico do zsh. Ao pesquisar essa resposta , descobri vi-history-search-backward qual permite pesquisar /no modo vi (no qual não mencionei que estava), você pode usar ne Npesquisar para frente e para trás, respectivamente (depois de pressionar enter).

xenoterracida
fonte
2

Estou surpreso que isso não tenha sido mencionado - mas você pode selecionar o modo vi no bash ou no ksh fazendo o seguinte:

set -o vi

... ou usando isso como o conteúdo de ~/.inputrc(para GNU readline usado em programas como o bash):

set editing-mode vi

Depois disso, você pode usar Escpara entrar no modo de comando e kvoltar no histórico e javançar. Você também pode pesquisar usando /para pesquisar normalmente e ?pesquisar ao contrário.

Se você usar ~/.inputrc, isso funcionará não apenas no GNU bash, mas em qualquer coisa que use a linha de leitura do GNU, como CLISP e possivelmente programas como o shell de comando do MySQL e o shell do CPAN.

Mei
fonte
2

Para avançar ao usar a pesquisa reversa (com o comando Ctrl-R):

  1. Abra o seu arquivo .bashrc:
    sudo gedit ~/.bashrc

  2. adicione esta linha (a letra "f" pode ser substituída por outra ainda não usada pelo sistema)

    bind '"\C-f": forward-search-history' 
  3. Feche seu arquivo e atualize seu .bashrc (ou abra outro terminal) com o comando:
    source ~/.bashrcou. ~/.bashrc

Agora você pode avançar na história com o atalho: Ctrl + f

Trabalhando no Ubuntu 18.04 LTS

Franklin TCHATATH
fonte
1

Eu uso as duas seguintes na maioria das vezes.
Mas observe que os dois pesquisam caracteres iniciais.

  1. tcsh : digite alguns caracteres do comando e Esc+ pele mostrará o comando anterior começando com a sequência de teclas pressionada novamente, ele mostrará outro comando.
  2. ksh : use fc -e - <SPACE> <first few char for your previous >isso para executar o último comando correspondente a essa sequência.

Não consegui encontrar algo como Ctrl+ Rno Bash para o meu ksh e tcsh.

Hemant
fonte
3
Ctrl + r funciona um pouco diferente em ksh do que o Bash. Pressione Ctrl + r, digite a string que você está procurando e pressione enter . Para procurar a mesma coisa, pressione Ctrl + r e digite sem precisar digitar novamente a sequência. A set -o emacspropósito, isso está no modo.
Dennis Williamson
@Dennis: +1 :-)
Hemant
1

Existe uma maneira de usar Ctrl- Rcom o tcsh . Adicione o seguinte no seu ~/.cshrc:

bindkey "^r" i-search-back (é apenas um sinal de sinal de intercalação e a letra r)

Essa é a maior economia de tempo para mim.

nariz grande
fonte
1

resposta semelhante a @ephemient, mas você pode colocar no seu .bashrc

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

digite parte da frase e use a seta para cima / para baixo para procurar as opções mais recentes correspondentes. Este é o comportamento padrão do matlab.

Para a maioria das pessoas, se você deseja portar suas configurações para um novo sistema, é mais fácil lembrar-se de capturar apenas o ~/.bashrcque você precisa~/.inputrc

Matt S.
fonte
0

Sim, existe, pelo menos se você estiver usando o zsh. Apenas comece a digitar o comando e pressione M-p( ESC p) e ele encontrará comandos anteriores que correspondem ao que você digitou. Pressione novamente para encontrar a próxima partida.

dkagedal
fonte
Esta resposta pode fazer com mais explicações.
## phreinhe #