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
eval
lí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
fc
operació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 -4
fuente
Para ver un rango de comandos en el historial, use el
fc
comando incorporado :Para ejecutarlos nuevamente:
fuente
man fc
no 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.-l
bandera, se ejecutará sin necesidad del maleval
.fc
significa 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 (
!432
o!-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-o
solo genera un literal^o
y 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
fc
para bucle yxsel
Esto 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