Posso pesquisar o histórico no bash e executar o resultado?
Posso pesquisar o histórico no bash e executar o resultado?
Respostas:
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 bash
pá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 history
builtin. 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 clear
comando. A história incorporada possui muitos recursos, você pode ver mais nas páginas de manual bash
e 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 vim
novamente, 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 bash
a 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 clear
novamente, 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 shopt
builtin:
$ 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 .bashrc
arquivo de inicialização para que seja definida sempre que você efetuar login.
Como já foi apontado, todas essas informações podem ser obtidas na bash
página de manual . Para os!, !! e!? designadores, dê uma olhada na Seção 9.3 Expansão do histórico .
shopt
vai no bashrc, não no bash_profile (ou não será ativado para shells que não são shells de login).
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.
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'
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
HISTIGNORE
.
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.
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:
ctrl + r
por padrão agora
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.
Se você tiver o seu shell configurado para usar vi
atalhos de teclado ( set -o vi
ou ter set editing-mode vi
em $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.
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óriased
: 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-J
e 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