Supongamos que quiero ejecutar una secuencia de cuatro comandos que he ejecutado antes. Si el primero es 432 en el historial de comandos, entonces podría hacer:
$ !432; !433; !434; !435
Tengo curiosidad, ¿hay una manera más eficiente de lograr esto?
bash
command-line
command-history
Eric Wilson
fuente
fuente

history -p \!43{2..5}para imprimir los comandos 432 a 435 en el terminal, adecuado para copiar / pegar posteriormente.Respuestas:
Si se refiere a comandos ejecutados recientemente, una forma más eficiente es hacer referencia a ellos con números negativos:
Además, una vez que lo haga, su última entrada del historial contendrá toda la cadena de comandos, por lo que puede repetirla con
!!.Editar: si aún no lo ha hecho, familiarícese con la gran función integrada
fc, mencionada por Gilles . (Usohelp fc.) Resulta que también puedes usar números negativos con él, por lo que puedes hacer lo mismo que arriba usandoSin embargo, esto tiene una advertencia: después de esto, la
evallínea se almacena en el historial como el último comando. Entonces, si ejecuta esto nuevamente, ¡caerá en un bucle!Una forma más segura de hacerlo es usar el modo de
fcoperación predeterminado : reenviar el rango seleccionado de comandos a un editor y ejecutarlos una vez que salga de él. Tratar:Incluso puede invertir el orden del rango de comandos:
fc -1 -4fuente
Para ver un rango de comandos en el historial, use el
fccomando incorporado :Para ejecutarlos nuevamente:
fuente
man fcno me da nada? ¿Qué significafc? ¿Qué otras opciones hay?help fc... y tambiénhelp help.... help: help [-dms] [pattern ...] Muestra información sobre los comandos incorporados.-lbandera, se ejecutará sin necesidad del maleval.fcsignifica comando" o "comando fijo".Hay una manera agradable y alternativa de ejecutar una serie de comandos en secuencia desde el historial de Bash: en
lugar de usar el sustituto del historial (
!432o!-4), puede buscar en el historial con Ctrl+ r, y una vez que haya encontrado el primer comando que desea ejecutar, presionar Ctrl+ o( operar-y-obtener-siguiente ) en lugar de la returnteclaEsto lanzará el comando y propondrá el siguiente del historial. Puede presionar Ctrl+otantas veces como desee y finalizar la secuencia con returnuna última, o Ctrl+cdetenerse sin iniciarla.
fuente
Ctrl-osolo genera un literal^oy rompe mi(reverse-i-search). Tal vez hay algún otro entorno involucrado.Para ejecutar los comandos inmediatamente en lugar de editarlos, aquí hay una versión sintácticamente más delgada de la respuesta de Giles usando eval :
El argumento de dos puntos para -e es el bash noop, que tiene el efecto de omitir el paso "abrir en un editor" que fc quiere. Además, ahora el historial (reciente) contendrá los comandos reales del historial, en lugar de la instrucción eval.
fuente
fcpara bucle yxselEsto funciona bien cuando quiero concatenar y volver a ejecutar los últimos n comandos varias veces:
Entonces:
O para comandos más grandes que pueden necesitar alguna edición:
fuente