Como posso pesquisar o histórico do bash e executar novamente um comando?

297

Posso pesquisar o histórico no bash e executar o resultado?

Richard Hoskins
fonte

Respostas:

428

Digite Ctrl Rna linha de comando e comece a digitar o comando anterior. Quando um resultado aparecer, continue pressionando Ctrl Rpara ver outras correspondências. Quando o comando desejado aparecer, basta pressionarEnter

Observe que while Ctrl Ré o padrão, se você deseja que o comando ( reverse-search-history) seja vinculado a Ctrl Tvocê, você pode configurá-lo com o seguinte:

bind '"\ Ct": histórico de pesquisa reversa'

Há uma série de outros comandos vinculáveis ​​readline que estão disponíveis para você também. Dê uma olhada na bashpágina de manual .

O Bash possui muitos recursos para pesquisar e acessar o histórico de comandos interativos. O mais básico do que é o historybuiltin. Digitando apenas:

$ história

Irá imprimir uma lista de comandos junto com um índice numérico, como:

$ história
1 claro
2 ls -al
3 vim ~ / somefile.txt
4 história
$

Você pode executar qualquer um desses comandos usando seu índice numérico, precedendo o índice por um único !, como Mitch apontou:

1

Irá executar o clearcomando. A história incorporada possui muitos recursos, você pode ver mais nas páginas de manual bashe history.

Você também pode especificar compensações negativas relativas ao usar o !designador; portanto, usando nossa lista de histórico acima, se quisermos executar vimnovamente, poderemos:

$! -2

O que basicamente diz ao bash para executar o comando que você executou "dois comandos atrás". Para executar o comando anterior na lista de histórico, podemos apenas usar !!(o que é apenas uma abreviação de !-1).

O !designador não limita você a especificar numericamente qual comando executar. hayalci mostrou que você pode instruir basha executar um comando com base no texto com o qual começa (usando !) ou no próprio comando (usando !?). Novamente, usando nossa lista de histórico de exemplo acima, se quisermos executar clearnovamente, tudo o que precisamos fazer é digitar:

$! cl

e pressione Enter. E que tal vim? Isso é tão simples quanto:

$!? some

O ponto mais importante da resposta de hayalci é a chamada para o shoptbuiltin:

$ shopt -s histverify

Isto irá permitir a verificação da história para que os comandos que são correspondidos pela !, !!e !?designadores não são cegamente executado, mas em vez preenchido na linha de comando para que você possa garantir que eles vão fazer nenhum mal antes de executá-los. Isso é ainda mais importante quando você está executando comandos como usuário root. Esta opção pode ser definida no seu .bashrcarquivo de inicialização para que seja definida sempre que você efetuar login.

Como já foi apontado, todas essas informações podem ser obtidas na bashpágina de manual . Para os!, !! e!? designadores, dê uma olhada na Seção 9.3 Expansão do histórico .

Comunidade
fonte
39
+1 Uso o Linux há mais de 12 anos para todos os sistemas. Eu não sabia que isso existia. Gostaria de poder +10 como eu perdi isso ??
Aiden Bell
1
Em muitos sistemas, pressionar a seta para cima faz o mesmo.
Más
Se alguém consolidasse '!', '!!', '!?', 'History | grep 'e' ctrl-r 'em uma resposta abrangente, eu selecionaria
Richard Hoskins
shoptvai no bashrc, não no bash_profile (ou não será ativado para shells que não são shells de login).
Tobu
2
Também depois de pressionar CTRL + R, você pode usar CTRL + SHIFT + R várias vezes para voltar ao comando anterior
Gal Bracha
37

Como alternativa crtl+R, você pode pesquisar no histórico digitando

!text

Isso pesquisará no histórico o comando mais recente que começa com 'texto'.

Mas eu sugiro que você coloque isso no seu .bashrc para impedir a execução de comandos errados.

shopt -s histverify

Isso instrui o bash para que, após qualquer ação do histórico (como !!:s/prev_text/after_text), coloque a linha resultante no prompt de comando. Em seguida, você pode revisar ou editar o comando e pressionar Enter posteriormente.

hayalci
fonte
5
Use!? Text para executar novamente o comando mais recente que contém (em vez de começar com) "texto".
mark4o
3
Se alguém consolidasse '!', '!!', '!?', 'History | grep 'e' ctrl-r 'em uma resposta abrangente, eu selecionaria.
Richard Hoskins
32

Você também pode fazer:

history | grep "stuff"

retornaria algo como

num stuff

então você pode digitar

!num
Mitch
fonte
15

Prefiro usar o histórico-pesquisa-para trás do que a pesquisa-reversa-história. O primeiro permite digitar alguns caracteres do comando e pressionar a tecla Pesquisar, em vez de pressionar a tecla Pesquisar e digitar a sequência de pesquisa.

Por padrão no meu sistema, Mp e Mn vinculam a funções semelhantes, mas eu prefiro vincular as teclas de seta:

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

Eu tenho um ótimo apelido, h. É realmente apenas "history | grep", mas eu filtro as entradas anteriores do "comando h" com o "grep -E -v"

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

usado como

h aliases
2003  less .bash_aliases
CurtH
fonte
1
Isso também pode ser realizado adicionando o comando a HISTIGNORE.
Tanenbring 15/05
12

Excelente redação, Sean! Eu colocaria isso em um comentário, mas tenho alguns pontos de reputação tímidos. :-)

Outra técnica relacionada e útil é a capacidade de executar um comando anterior enquanto altera uma palavra. Digamos que você digitou o nome do diretório ou deseja alterar o nome do arquivo:

$ echo meu nome é bob
meu nome é Bob
$ ^ bob ^ jordan
eco meu nome é jordan
meu nome é Jordan

Observe que o comando é expandido, substituído e emitido antes da execução do comando; portanto, se o comando errado for executado, você poderá ver o que o bash pensou que estava fazendo.

Jordânia
fonte
6

Como a navegação no histórico usando Ctrl-r é IMO complicada, convém considerar hh :

https://github.com/dvorka/hstr

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

insira a descrição da imagem aqui

Martin Dvorak
fonte
Como usá-lo? Quais teclas pressionar para ver esta foto?
Nakilon
2
Depois de instalar o hh, você pode usar o comando hh OU vinculá-lo a qualquer atalho do teclado (normalmente Ctrl-r), conforme descrito na documentação.
Martin Dvorak
se liga a ctrl + rpor padrão agora
Alleo
4

No prompt de comando do bash, digite control-R e digite alguns caracteres do comando que você deseja, e o recurso de linha de leitura do bash pesquisará no histórico de comandos por esse comando.

Depois de iniciar a pesquisa, você pode digitar control-R novamente para pular para o próximo comando correspondente.

John1024
fonte
3

Se você tiver o seu shell configurado para usar viatalhos de teclado ( set -o viou ter set editing-mode viem $HOME/.inputrc), então você pesquisar com <Esc>/some-command<Return>e bater n(seguinte) ou Shift-n(anterior) para percorrer o histórico da linha de comando.

Fernando Basso
fonte
Este é o mais próximo dos usuários do vim.
Gabor Marton
2

CTRL+ Rfunciona muito bem, como sugerido por John1024, mas é um pouco tedioso se muitos de seus comandos recentes forem semelhantes e você desejar uma maneira rápida de verificar todos eles. Uma alternativa seria usar history:

$ history | grep keyword
Mureinik
fonte
0

Eu gosto do HSTR, mas às vezes não consigo instalá-lo. Então, escrevi um pseudônimo usando fzf que imita seu comportamento ( hx, para "history execute")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bem, conheça a história
  • sed : remova a coluna numérica da lista (POSIX)
  • fzf: aqui está a mágica, permite que você faça pesquisas difusas na lista interativamente ou mova-se com C-Je C-K, em seguida, execute um comando com Enter.
  • --height : defina o número de linhas exibidas.
  • --tac : reverter lista (mais lógico para um histórico)
  • --tiebreak=index : mantenha a ordem do histórico quando o fzf atualizar os resultados
Biggybi
fonte