Suponha que eu queira executar uma sequência de quatro comandos que eu executei antes. Se o primeiro for 432 no histórico de comandos, eu poderia fazer:
$ !432; !433; !434; !435
Estou curioso, existe uma maneira mais eficiente de conseguir isso?
bash
command-line
command-history
Eric Wilson
fonte
fonte
history -p \!43{2..5}
para imprimir os comandos 432 a 435 no terminal, adequado para copiar / colar subsequente.Respostas:
Se se referir a comandos executados recentemente, uma maneira mais eficiente é referenciá-los com números negativos:
Além disso, depois de fazer isso, sua entrada no último histórico conterá toda a cadeia de comandos, para que você possa repeti-la
!!
.Edit: Se você ainda não o conhece, familiarize-se com a excelente função incorporada
fc
, mencionada por Gilles . (Usehelp fc
.) Acontece que você também pode usar números negativos com ele, para fazer o mesmo que acima, usandoPorém, isso tem uma ressalva: depois disso, a
eval
linha é armazenada no histórico como o último comando. Então, se você executar isso novamente, você entrará em um loop!Uma maneira mais segura de fazer isso é usar o
fc
modo de operação padrão : encaminhar o intervalo de comandos selecionado para um editor e executá-los quando você sair dele. Experimentar:Você pode até reverter a ordem do intervalo de comandos:
fc -1 -4
fonte
Para visualizar um intervalo de comandos no histórico, use o
fc
comando interno:Para executá-los novamente:
fonte
man fc
que não me dá nada. O quefc
significa? Que outras opções existem?help fc
... e tambémhelp help
.... help: help [-dms] [pattern ...] Exibe informações sobre comandos internos.-l
bandeira, ele será executado sem necessidade do maleval
.fc
significa "comando de localização" ou "comando de correção".Existe uma maneira agradável e alternativa de executar vários comandos em sequência no histórico do Bash: em
vez de usar o substituto do histórico (
!432
ou!-4
), você pode pesquisar no histórico com Ctrl+ re depois de encontrar o primeiro comando que deseja execute, pressione Ctrl+ o( opere e opte pelo próximo ) em vez da returnteclaIsso iniciará o comando e proporá o próximo do histórico. Você pode acertar Ctrl+oquantas vezes quiser e terminar a sequência com returnuma última, ou Ctrl+cparar sem iniciá-la.
fonte
Ctrl-o
ele produz um literal^o
e quebra meu(reverse-i-search)
. Talvez haja alguma outra configuração envolvida.Para executar os comandos imediatamente, em vez de editá-los, eis uma versão sintaticamente mais fina da resposta do Giles usando eval :
O argumento de dois pontos para -e é o bash noop, que tem o efeito de pular a etapa "abrir em um editor" que o fc deseja. Além disso, agora o histórico (recente) conterá os comandos reais do histórico, em vez da instrução eval.
fonte
fc
para loop exsel
Isso funciona bem quando eu quero concatenar e executar novamente os últimos n comandos várias vezes:
Então:
Ou para comandos maiores que possam precisar de alguma edição:
fonte