Seleccionar comandos del historial de bash

20

Presionar el botón arriba es tedioso y podría perder el comando que estaba buscando. Entonces, cuando escribo historyen la terminal me da todos los comandos que he ingresado anteriormente, indexados a un número. ¿Hay alguna forma de que pueda llamar al número asociado con el comando?

usuario182936
fuente
alguna opción más interactiva por ahora? estos son tan propensos a errores
mate

Respuestas:

31

La historia de bash puede hacer muchas cosas útiles, y la búsqueda con la Strg-rque mencionó Terry Wang es importante entre ellas. Pero también es posible hacer exactamente lo que solicitó.

Puede volver a hacer el comando anterior con !!. Con esto, también puede editar el comando anterior. Si, por ejemplo, olvidó obtener privilegios de root para un comando

apt-get install a-long-list-of-packages

no tienes que volver a escribir todo eso de nuevo. En su lugar solo llame

sudo !!

Si desea volver a ejecutar el comando en una posición específica de su historial, también puede usar !, por ejemplo

!3

para volver a ejecutar el comando en la posición 3. Tenga en cuenta que esto cuenta desde arriba. Entonces, si está almacenando 500 comandos en su historial, !1sería "hace 500 comandos". También puedes usar números negativos. Por ejemplo

!-2

volvería a ejecutar el segundo último comando.

También puede volver a ejecutar el último comando que comenzó con una cadena como

!apt-

que volvería a hacer la última línea que comenzó con "apt-". Si desea el último comando donde apareció la cadena en cualquier lugar de la línea, puede usar algo como

!?pt-ge

Hay cosas más interesantes que la historia de bash puede hacer. Solo para dar una idea de la amplia gama de posibilidades, puede acceder específicamente a un parámetro de un comando desde el historial. Entonces

!-5:3:p

imprimiría el tercer parámetro al quinto desde el último comando.

EDITAR: Con respecto al comentario de Rudie a continuación, con la configuración estándar, estas expansiones del historial de bash se ejecutan directamente. Probablemente se describa mejor así: una llamada como !-3se reemplaza por el shell con el tercer último comando de su historial y luego se ejecuta su entrada (con el reemplazo). Entonces, si escribe !-3y presiona ENTERy su tercer último comando fue ls ~, en efecto es lo mismo que si ls ~volviera a escribir y presiona ENTER"por su cuenta".

Si no quiere eso, puede configurar la opción de shell histverify. Para configurar y desarmar opciones de shell, es posible que desee leer sobre el shoptcomando. Con histverifyset, una llamada como !-3solo escribe el reemplazo de su historial en su línea de comando, pero no lo ejecuta directamente. Tienes que, por decirlo así, presionar el crucial ENTERtú mismo, o abstenerte de hacerlo, si lo deseas.

Henning Kockerbeck
fuente
Entonces !es bastante peligroso ... Me gustaría saber qué !-4hizo exactamente antes de ejecutarlo. ¿O te muestra primero? Resumen genial!
Rudie
1
@Rudie Ese es un buen punto, actualicé mi respuesta. Las características del historial están destinadas principalmente a acelerar su trabajo y ahorrar pulsaciones de teclas. Entonces, un estándar "¿De verdad, realmente quieres decir eso?" al menos parcialmente derrotaría ese propósito. Y aunque podría, normalmente no llamará a un comando "muy atrás" como !-238. No debería ser demasiado difícil recordar su segundo, último, quizás el último comando;) Como a menudo con Linux (y, en realidad, con la informática en general), se espera que sepa lo que está haciendo. Y si realmente quiere la red de seguridad adicional, está a una shoptdistancia;)
Henning Kockerbeck
16

Sí hay. Si, por ejemplo, desea ejecutar el comando que tiene el número 1234 al lado, haga lo siguiente:

!1234

Otras cosas útiles:

  • Si desea ejecutar el último comando que ejecutó, haga:

    !!
  • Si desea ejecutar el último lscomando que ejecutó, haga:

    !ls
  • Si acaba de correr ls /some/long/pathy quiere cdhacerlo, haga lo siguiente:

    cd !$

Para más información:

Alaa Ali
fuente
3

Si ha encontrado el número de historial de un comando y desea ejecutarlo nuevamente, escriba !seguido del número, por ejemplo, !1234y presione Enter. Esto es parte de la expansión de la historia ; puedes agregar modificadores en él.

Si desea editar el comando antes de ejecutarlo, fc 1234invoca un editor externo.

Pero como Terry Wang ya mencionó , generalmente hay formas más rápidas de ubicar un comando en el historial que determinar su número de historial, incluido Ctrl+ Rpara invocar la búsqueda incremental (presione Entercuando haya encontrado el comando que desea ejecutar) o fc PREFIXejecutar el comando anterior comando que comienza con PREFIX.

Gilles 'SO- deja de ser malvado'
fuente
1

El historycomando mostrará todos los comandos y sus números asociados. Si desea hacer una comprobación rápida antes de ejecutar la línea de comando # 135, puede escribir:

echo !135

Esto le mostrará lo que se va a ejecutar.

Bruce M
fuente