Repetir os últimos comandos N [duplicados]

2

No bash, tentei escrever um script para executar os últimos N comandos. Por exemplo, N = 5

for i in {1...5}
do
    !-5
done

O problema é que! -5 é substituído pelo 5º último comando no meu shell (digamos, time) e o comando 'time' é executado 5 vezes.

Posso fazer alguma alteração no meu script para executar os últimos 5 comandos no meu shell em série?


OBSERVAÇÃO: publiquei esta pergunta APÓS verificar outra pergunta semelhante que não atendia aos meus requisitos. A situação era análoga a isso:
Qn1 - "Como você imprimir 3 tis consecutivos '~~~' em C ++"
Resp: cout < < "~~~";

Qn2 - "Como você imprime N tis consecutivos '~~~' em C ++"
Resp: Executa um loop e faz o comando < < "~"; dentro do loop

As perguntas marcadas como duplicadas são semelhantes a Qn1 de cima e o que eu queria era a resposta ao Qn2 acima. Então, eu discuto o fato de que é uma duplicata para a pergunta anterior.

    
por Yaitzme 09.09.2014 / 16:06

3 respostas

3

Com fc -N -1 , um editor é aberto com os últimos N comandos.
Você pode editar os comandos.
Eles são executados quando você os salva.

Se você não quiser editar os comandos, use a fc option -e para especificar cat como editor:

fc -e : -3 -1

Se você quiser usá-lo com um argumento para o N, um alias não ajuda. Você não pode nem ter um alias como 'fc -1' e acrescentar o -N , porque o -1 precisa estar após o -N .

Portanto, precisamos usar uma função:

runlast () {
    fc -e : "-${1:-1}" -1 
}

O N é definido como 1 explicitamente se nenhum argumento for fornecido; Neste caso, o último comando é repetido.


Veja como funciona, usando echo 1 to echo 4 como os últimos comandos:

$ echo 1
1
$ echo 2
2
$ echo 3
3
$ echo 4
4
$ runlast 2
echo 3
echo 4
3
4
$

(A última linha com $ é o novo prompt.)

    
por 09.09.2014 / 16:22
2

Não tem certeza do que você está tentando fazer exatamente, mas você pode tentar algo como:

eval "$(fc -ln -5)"

Ou

fc -e : -5 -1

Para executar novamente seus últimos 5 comandos.

    
por 09.09.2014 / 16:18
0

Eu acho que você pode fazer isso:

$ echo yo
yo
$ echo hey there
hey there
$ for i in {2..1}; do eval "$(history -p \!-$i)"; done
yo
hey there

De help history :

-p   perform history expansion on each ARG and display the 
     result without storing it in the history list
    
por 09.09.2014 / 16:47