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?
Posso pesquisar a história em bash e ver o resultado?
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.
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'
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.
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:
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.
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.
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
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