Existe um atalho para executar uma série de comandos no histórico bash?

20

Suponha que eu tenha o seguinte exemplo trivial no meu history :

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

Se eu quisesse executar os comandos 77 , 78 e 79 em um comando, existe um atalho para isso? Eu tentei !77 !78 !79 , que irá simplesmente colocá-los todos em uma única linha para executar.

    
por MrDuk 23.10.2017 / 20:31

2 respostas

28

EDIT: Você pode fazer isso de maneira compatível com POSIX com o comando de correção ferramenta fc :

fc 77 79

Isto irá abrir o seu editor (provavelmente vi ) com os comandos 77 a 79 no buffer. Quando você salvar e sair ( :x ), os comandos serão executados.

Se você não quiser editá-los e tiver certeza de quais comandos está chamando, use:

fc -e true 77 79

Isso usa true como um "editor" para editar os comandos com, portanto, ele sai sem fazer nenhuma alteração e os comandos são executados como estão.

RESPOSTA ORIGINAL:

Você pode usar:

history -p \!{77..79} | bash

Isso pressupõe que você não está usando nenhum apelido ou função ou qualquer variável que esteja presente apenas no ambiente de execução atual, como é óbvio que eles não estarão disponíveis no novo shell sendo iniciado.

Uma solução melhor (graças a Michael Hoffman por me lembrar nos comentários) é:

eval "$(history -p \!{77..79})"

Um dos poucos casos em que eval é realmente apropriado!

Veja também:

por 23.10.2017 / 20:46
14

Resposta simples: em vez de !77 !78 !79 ,

  • digite !77; !78; !79 para fazer o que parece que você está tentando fazer execute o comando 77 e, em seguida, o comando 78 e, em seguida, o comando 79, incondicionalmente, ou
  • digite !77 && !78 && !79 para executar o comando 77 e verificar se foi bem-sucedido. E então, se o comando 77 for bem sucedido, execute o comando 78. E então, se o comando 78 for bem sucedido, execute o comando 79.

Resposta ligeiramente inteligente (se você estiver em uma janela do tipo terminal):

  • Descobrir qual número de comando o próximo comando que você digitar será.
    • É possível incluir isso no seu prompt; Acredito que inclua \! no seu PS1 .
    • Ou olhe para sua listagem de histórico. Se a última entrada for 82 history , seu próximo comando será 83.
  • Subtraia 83−77 = 6.
  • Digite !-6 . Isso irá executar novamente o comando 77.
  • Selecione o !-6 , copie-o e cole-o. Como sua reexecução do comando 77 ( ./generator.sh ) era o comando 83, você está agora no comando 84, então !-6 irá executar novamente o comando 78.
  • Repita a colagem de !-6 conforme desejado.
por 23.10.2017 / 20:39