2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

Como posso pesquisar a história da bash e voltar a executar um comando?

Posso pesquisar a história em bash e ver o resultado?

Respostas (10)

38
38
38
2009-07-17 20:40:32 +0000

Como alternativa à crtl+R, pode pesquisar o histórico escrevendo

!text

Isto irá pesquisar o histórico para o comando mais recente beginning com ‘texto’.

Mas sugiro que coloque isto no seu .bashrc para evitar a execução de comando errado.

shopt -s histverify

Isto instrui a bash tal que, após qualquer acção do histórico (como !!:s/prev_text/after_text), coloca a linha resultante no prompt do comando. Depois pode rever ou editar o comando, e pressionar Enter depois.

33
33
33
2009-07-17 20:21:39 +0000

Também poderia fazer:

history | grep "stuff"

devolveria algo como

num stuff

depois pode digitar

!num
16
16
16
2011-02-02 20:32:12 +0000

Prefiro utilizar a história - procurar para trás em vez de procurar para trás - história. A primeira permite digitar alguns caracteres do comando então prima a tecla de pesquisa, em vez de premir primeiro a tecla de pesquisa e depois digitar a sequência de pesquisa.

Por defeito no meu sistema, M-p e M-n ligam-se a funções semelhantes, mas prefiro ligar as teclas de seta:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

Tenho um pseudónimo muito bom, h. É realmente apenas “história | grep”, mas filtro as entradas anteriores do “h comando” com o “grep -E -v”

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

usado como

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

Excelente escrita, Sean! Colocaria isto num comentário, mas sou tímido em relação a alguns pontos de reputação :-)

Outra técnica relacionada e útil é a capacidade de executar um comando anterior enquanto se muda uma palavra. Digamos que digitou o nome do directório, ou quer alterar o nome do ficheiro:

$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan

Note que o comando é expandido, substituído, e sai antes do comando ser executado, por isso se o comando errado for executado pode ver o que a bash pensava que estava a fazer.

6
6
6
2014-12-18 16:37:14 +0000

Como a navegação através da história utilizando Ctrl-r é incómoda para a IMO, poderá querer considerar hh* : https://github.com/dvorka/hstr

o que torna a navegação muito mais simples, directa e eficiente - incluindo a execução do comando:

4
4
4
2014-09-04 04:55:04 +0000

No prompt de comando bash, digite controll-R, depois digite alguns caracteres do comando que deseja e a facilidade de linha de leitura bash irá procurar esse comando no histórico de comandos.

Depois de ter iniciado a pesquisa, pode digitar novamente control-R para saltar para o próximo comando correspondente.

3
3
3
2015-11-22 15:21:56 +0000

Se tiver a sua concha configurada para utilizar ligações vi (set -o vi ou ter set editing-mode vi em $HOME/.inputrc), então procura com <Esc>/some-command<Return> e carrega em n (seguinte) ou Shift-n (anterior) para percorrer o histórico da linha de comando.

2
2
2
2014-09-04 05:11:10 +0000

CTRL+R funciona muito bem, como @John1024 sugeriu, mas é algo enfadonho se muitos dos seus comandos recentes forem semelhantes e se quiser uma forma rápida de os digitalizar a todos. Uma alternativa seria utilizar history :

$ history | grep keyword
0
0
0
2019-05-22 13:17:52 +0000

Eu gosto de HSTR mas por vezes não consigo instalá-lo. Por isso escrevi um pseudónimo usando fzf que imita o seu comportamento (hx, para “histórico executar”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bem, obter o histórico
  • sed : remover a coluna de números da lista (POSIX)
  • fzf : aqui está a magia, permite pesquisar a lista interactivamente, ou mover-se com C-J e C-K, depois executar um comando com Enter. & - --height : definir os números das linhas mostradas.
  • --tac : reverter a lista (mais lógico para um histórico)
  • --tiebreak=index : manter a ordem do histórico quando fzf actualiza os resultados