Executa comandos do histórico que correspondem a regex ou grep

2

Eu queria saber se é possível executar comandos do histórico que correspondem a um certo regex? Eu sei que você pode fazer algo parecido com

fc 232 248

E ele entrará no seu history e, em seguida, fará as revisões 232-248 consecutivas.

No entanto, se alguns dos comandos intermediários são coisas que eu não quero fazer, existe uma maneira de especificar isso? No momento, eu procuro meu history e canalizo para um grep

history | grep checkout

Então, isso procurará todas as ações do terminal que fiz com o checkout que fiz.

232 git checkout master files/file1.txt
234 git checkout master files/file2.txt
248 git checkout master files/file3.txt

Filtra alguns dos números, então eu só quero executar os que foram canalizados. em vez de tudo entre

    
por aug 29.04.2015 / 01:03

1 resposta

1

Para executar todos os comandos que contêm uma string específica (por exemplo, "checkout" ) ou regex (por exemplo, "checkout.+file\d" ) de seu bash history :

grep -E "string_exp" $HOME/.bash_history | while read line; do eval "$line"; done

Você pode salvá-lo como uma função em ~/.bashrc :

#!/bin/bash

all_prev () {
   grep -E "$1" $HOME/.bash_history | while read line; do eval "$line"; done
}

Então, no futuro, você pode simplesmente digitar:

all_prev checkout

EDITAR:

  • Para evitar a execução de muitos comandos duplicados à medida que seu arquivo .bash_history é acumulado ao longo do tempo, verifique se export HISTCONTROL=ignoredups está definido em ~/.bashrc , se ainda não estiver.

  • Para evitar a nova execução da pesquisa all_prev que contém o termo de pesquisa, use regex ^ e $ para especificar caracteres no início e no final da linha.

No entanto, talvez você também deva verificar um shell com um filtro de histórico mais poderoso, como zsh (ou mesmo fish ).

    
por 01.05.2015 / 02:54