Questão Como posso pesquisar o histórico bash e reexecutar um comando?


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


271


origem




Respostas:


Tipo Ctrl  R na linha de comando e comece a digitar o comando anterior. Quando um resultado aparecer, continue batendo Ctrl  R para ver outros jogos. Quando o comando desejado aparecer, basta pressionar Entrar

Note que enquanto Ctrl  R é o padrão, se você quiser o comando (reverse-search-history) ser obrigado a Ctrl  T você poderia configurar isso com o seguinte:

bind '"\ C-t": reverse-search-history'

Há toda uma série de outros comandos bindable readline que estão disponíveis para você também. Dê uma olhada no bash página man.

O Bash tem muitos recursos para pesquisar e acessar o histórico de comandos interativos. O mais básico dos quais é o history construídas em. Digitando apenas:

$ history

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

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

Você pode então executar qualquer um desses comandos usando seu índice numérico, prefazendo o índice com um único !, Como Mitch apontou:

$ 1

Vai executar o clear comando. A história embutida tem muitos recursos em si, você pode ver mais no bash e history páginas man.

Você também pode especificar offsets negativos relativos ao usar o ! designador, portanto, usando nossa lista de histórico acima, se quiséssemos executar vim mais uma vez, poderíamos fazer:

$! -2

Que basicamente está dizendo 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 !! (que é apenas uma abreviação para !-1).

o ! designador não o limita a especificar numericamente qual comando executar. Hayalci mostrou que você pode instruir bash para executar um comando com base no texto com o qual começa (usando !) ou texto dentro do próprio comando (usando !?). Novamente, usando nossa lista de histórico de exemplo acima, se quiséssemos executar clear novamente, tudo o que precisamos fazer é digitar:

$! cl

e pressione Entrar. E sobre vim? Isso é tão simples quanto:

$!

O ponto mais importante de Hayalcia resposta é a chamada para o shopt construídas em:

$ shopt -s histverify

Isso permitirá a verificação do histórico para que os comandos correspondidos !, !!e !? os designadores não são executados cegamente, mas são preenchidos na linha de comando para que você possa garantir que eles não farão maldade antes de executá-los. Isso é ainda mais importante quando você está executando comandos como o usuário root. Esta opção pode ser definida no seu .bashrc arquivo de inicialização para que seja definido sempre que você efetuar login.

Como já foi salientado, toda esta informação pode ser obtida a partir do bash página man. Para o!, !! e! designadores, dê uma olhada na Seção 9.3 Expansão da História.


390



Eu tenho usado o Linux há mais de 12 anos para todos os sistemas. Eu não sabia que existia. Gostaria de poder +10 como eu perdi isso ?? - Aiden Bell
Eu não descobri isso até que comecei a usar o emacs regularmente. Então eu acidentalmente digitei em um dia (pensando que eu estava no emacs). - Sean Bright
Em muitos sistemas, pressionar a seta para cima faz o mesmo. - mas
Seta para cima para mim só vai para o comando anterior. Mas sim, tudo é vinculável ao que você quiser. - Sean Bright
Além disso, depois de pressionar CTRL + R, você pode usar CTRL + SHIFT + R várias vezes para voltar ao comando anterior - Gal Bracha


Como uma alternativa para crtl + R, você pode pesquisar o histórico digitando

!text

Isto irá procurar no histórico pelo comando mais recente começando com 'texto'.

Mas eu sugiro que você coloque isso no seu .bashrc para evitar a execução do comando errado.

shopt -s histverify

Isso instrui bash tal que, depois qualquer ações de história (como !!:s/prev_text/after_text), coloca a linha resultante no prompt de comando. Em seguida, você pode revisar ou editar o comando e pressionar Enter depois.


34



Use o texto !, para executar novamente o comando mais recente contendo (em vez de começar com) "texto". - mark4o
Se alguém fosse consolidar '!', '!!', '!?', 'História | grep 'e' ctrl-r 'em uma resposta abrangente, eu selecionaria. - Richard Hoskins


Você também pode fazer:

history | grep "stuff"

ele retornaria algo como

num stuff

então você pode digitar

!num

27





Eu prefiro usar history-search-backward sobre reverse-search-history. O primeiro permite digitar alguns caracteres do comando então pressione a tecla de busca, ao invés de apertar a tecla de busca primeiro, então digite a string de busca.

Por padrão no meu sistema, M-p e M-n se ligam a funções similares, mas eu prefiro ligar as teclas de seta:

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

14





Excelente writeup, 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 ao alterar 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 enviado antes que o comando seja executado, portanto, se o comando errado for executado, você poderá ver o que o bash achou que estava fazendo.


12





Eu tenho um ótimo apelido, h. É realmente apenas "history | grep", mas eu filtro entradas anteriores de "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

12



Isso também pode ser feito adicionando o comando HISTIGNORE. - tanenbring


Como a navegação pelo histórico usando Ctrl-r é IMO incômoda, você pode querer 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:

enter image description here


5



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


No prompt de comando do bash, digite control-R e, em seguida, digite alguns caracteres do comando desejado e o recurso readline do bash pesquisará o histórico de comandos desse comando.

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


3