Como iniciar o primeiro comando da lista impressa pelo comando 'history | grep something '

2

Por exemplo, tenho a seguinte saída do comando:

loom@loom:$ history | grep MAKE
  219  ../build.sh -DCMAKE_BUILD_TYPE=Debug ..
  909  history | grep MAKE

Como escrever um comando, que inicia o primeiro comando da lista? Além disso, gostaria de saber como iniciar o n-ésimo comando a partir da saída de history | grep something ?

    
por Loom 20.01.2014 / 15:47

3 respostas

2

Veja os números à esquerda da saída? Você pode usá-los para se referir a esse comando com a expansão do histórico do shell; ![number] na maioria dos shells.

Isso funciona em bash e zsh :

$ echo "hello"
hello
$ history | grep hello
 5057  echo "hello"
$ !5057
echo "hello"
hello
$
    
por 20.01.2014 / 16:13
2

Não é uma solução muito elegante, mas funciona.

i=5  # Execute 5th command from the beginning of history
'history | sed -n "${i}p" | sed 's/^.\{7\}//''
    
por 20.01.2014 / 16:00
0

a seguinte função bash deve fazer o que você quer em muitos casos.

uso: nthhist 3 MAKE executará o terceiro comando que continha MAKE .

nota: isto não funcionará se o comando encontrado desta forma for apenas um bash-internal

nthhist() {
  local NTH
  NTH=$1
  shift
  history \
  | grep -v "nthhist" \
  | grep "$@" \
  | head -${NTH} | tail -1 \
  | while read id cmd
  do
    $cmd
  done
}
    
por 20.01.2014 / 16:07