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 comandos 77
, 78
e 79
em um comando, existe um atalho para isso? Eu tentei !77 !78 !79
, o que simplesmente colocará todos eles em uma única linha para executar.
bash
command-line
command-history
MrDuk
fonte
fonte
!77 ; !78 ; !79
bem?!77-79
)Respostas:
EDIT: Você pode fazer isso de maneira compatível com POSIX com a ferramenta de comando fix
fc
:Isso abrirá 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 deseja editá-los e com certeza sabe quais comandos está chamando, pode usar:
Isso é usado
true
como um "editor" para editar os comandos, portanto, ele sai sem fazer nenhuma alteração e os comandos são executados como estão.RESPOSTA ORIGINAL:
Você pode usar:
Isso pressupõe que você não esteja usando aliases ou funções ou variáveis presentes apenas no ambiente de execução atual, pois é claro que elas não estarão disponíveis no novo shell que está sendo iniciado.
Uma solução melhor (obrigado Michael Hoffman por me lembrar nos comentários) é:
Um dos muito poucos casos em que
eval
é realmente apropriado!Veja também:
fonte
cd
, mas esse é um caso extremo.eval "$(history -p \!{77..79})"
Deveria trabalhar.Resposta simples: em vez de
!77 !78 !79
,!77; !78; !79
para fazer o que parece estar tentando fazer - execute o comando 77 e, em seguida, o comando 78 e, em seguida, o comando 79, incondicionalmente ou!77 && !78 && !79
para executar o comando 77 e verifique se foi bem-sucedido. E então, se o comando 77 tiver êxito, execute o comando 78. E, se o comando 78 tiver êxito, execute o comando 79.Resposta ligeiramente mais inteligente (se você estiver em uma janela do tipo terminal):
\!
no seuPS1
.82 history
, seu próximo comando será 83.!-6
. Isso reexecutará o comando 77.!-6
, copie e cole. Como sua reexecução do comando 77 (./generator.sh
) foi o comando 83, agora você está no comando 84, então!-6
reexecutará o comando 78.!-6
conforme desejado.fonte