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