La mejor manera de buscar en la historia de Shell

78

¿Hay una mejor manera de buscar un comando en mi archivo de historial que grep? Tengo alguna idea de cómo comienza el comando, pero no sé qué tan atrás en la historia está.

actualización: anteriormente era específico de zsh, pero debido a la superposición de respuestas, no dude en responder para cualquier shell (o modo (vi / emacs)) aquí, solo tenga en cuenta si es específico.

xenoterracida
fuente

Respuestas:

73

Ctrl+ Rsuele ser la mejor manera, como dijo el descriptor . También puede usar !string, que ejecuta el comando más reciente que comienza con string, o !?string?, que ejecuta el comando más reciente que contiene string.

(Creo que eso es lo único relevante para esta pregunta, pero cubrí mucho más de los comandos del historial en esta respuesta )

Michael Mrozek
fuente
44
¿Cómo haces que 'ctrl + r' se vea así?
xenoterracide
13
@xen <kbd>Ctrl+R</kbd>. fuente de respuesta
Michael Mrozek
No me di cuenta de que el motor SE aceptaba html, gracias.
xenoterracide
¡No sabía que la palabra clave kbd interpretaría correctamente "ctrl" y "+"! Solía ​​etiquetar cada tecla por separado. ¡Gracias!
Olivier Dulac
2
@OlivierDulac Lamentablemente no, así es como solía formatear las teclas; alguien editó mi respuesta más tarde para hacerlas claves separadas
Michael Mrozek
30

Cuando use Bash, escriba Control- Ry luego comience a escribir. Escribir Control: Rrepetidamente después de ingresar algo de texto lo moverá hacia atrás en líneas de comando coincidentes.

grendel
fuente
18

No estoy seguro de si esto ayudará, pero me gusta usar ctrl, ry luego comenzar a escribir el comando. Debe revisar tu historia y presentarte el primer partido. Para alternar entre los partidos simplemente pulse ctrl- rde nuevo.

descriptor
fuente
2
Lo siento, me olvidé del zsh. Es posible que deba agregar esta combinación de teclas a su ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
descriptor
17

Si agrega lo siguiente a ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

y reinicie Bash, puede comenzar a escribir y luego usar Page Upy Page Downpara retroceder y avanzar a través del historial de líneas que comienzan con el mismo prefijo que acaba de escribir.

(Algunos pueden preferir usar \e[Ay \e[B, que reemplazará lo normal Upy las Downacciones en lugar de vincular nuevas claves).

efímero
fuente
Prefiero asignar estos comandos a Alt + Upy Alt + Down. Dependiendo de la emulación de teclado la Emular terminal utiliza estas combinaciones pueden ser mapeados o bien para \E[Ay \E[A(por ejemplo KDE Konsole con Linux Key Bindings) o \E[1;3Ay \E[1;3B(por ejemplo Terminal XFCE o KDE Konsole con X libre 4 Bindings).
Christian Herenz
9

La solicitud interactiva invocada por Ctrl- R, que ya se había mencionado, es la forma más conveniente. Además, es popular reasignar Upy Downlas teclas de flecha para buscar en el historial un prefijo actualmente en la línea de comando, sin embargo, esto requiere algunos cambios en el ~/.inputrcarchivo .

La solución clásica y menos interactiva es utilizar la expansión del historial de shell. Mecanografía

!foo

ejecutará el último comando que comienza con fooy

!?foo

ejecutará el último comando que contiene foo. Puede encontrar más información sobre la expansión del historial en el manual de referencia de Bash , suponiendo que su shell sea Bash o compatible.

Adam Byrtek
fuente
6

Si agrega stty -ixona su ~/.bashrcarchivo entonces Ctrl- sirá en la dirección opuesta a Ctrl- r.

Dennis Williamson
fuente
Quería usar C-spara este propósito, pero mi terminal se congeló ; ¡tener cuidado! (Bueno, todavía no he empleado ninguno stty ixon, no estoy seguro de para qué sirve).
imz - Ivan Zakharyaschev
3
@imz: C-qse "descongelará". Es y C-sson los caracteres habituales de control de flujo de software que alguna vez fueron útiles para interrumpir manualmente (pausar) el flujo de salida cuando se usaban conexiones seriales lentas. Ahora la salida es tan rápida en la mayoría de los casos que lo que desea ver cuando presiona C-sya se ha desplazado. stty -ixonapaga el control de flujo de software.
Dennis Williamson
¡Fantástico! He buscado durante años una forma de avanzar en la historia como esta.
marlar
3

Si escribe !ls, bash revisará su historial y ejecutará el comando más reciente que comienza con "ls"

Kevin M
fuente
2

podría ser zsh específico. Al investigar esta respuesta , encontré vi-history-search-backward que permite buscar /en modo vi (que no mencioné en el que estaba), puede usar ny Nbuscar hacia adelante y hacia atrás respectivamente (después de presionar enter).

xenoterracida
fuente
2

Me sorprende que esto no se haya mencionado, pero puede seleccionar el modo vi en bash o ksh haciendo esto:

set -o vi

... o usando esto como el contenido de ~/.inputrc(para GNU readline usado en programas como bash):

set editing-mode vi

Luego, después de eso, puede usar Escpara ingresar al modo de comando y usar kpara retroceder en el historial y javanzar. También puede buscar usando /para buscar normalmente y ?para buscar en reversa.

Si lo usa ~/.inputrc, esto funcionará no solo en GNU bash sino en cualquier cosa que use GNU readline como CLISP y posiblemente programas como el shell de comandos MySQL y el shell CPAN.

Mei
fuente
2

Para avanzar cuando se usa la búsqueda inversa (con el comando Ctrl-R):

  1. Abra su archivo .bashrc:
    sudo gedit ~/.bashrc

  2. agregue esta línea (la letra "f" puede reemplazarse por otra que el sistema aún no haya utilizado)

    bind '"\C-f": forward-search-history' 
  3. Cierre su archivo y actualice su .bashrc (o abra otra terminal) con el comando:
    source ~/.bashrco. ~/.bashrc

AHORA PUEDE AVANZAR EN LA HISTORIA CON EL ACCESO CORTO: Ctrl + f

Trabajando en Ubuntu 18.04 LTS

Franklin TCHATATH
fuente
1

Yo uso siguientes dos la mayor parte del tiempo.
Pero tenga en cuenta que ambos buscan caracteres iniciales.

  1. tcsh : escriba algunos caracteres del comando y luego Esc+ pmostrará el comando anterior que comienza con esa secuencia de teclas, presiónelo nuevamente para mostrar otro comando.
  2. ksh : use fc -e - <SPACE> <first few char for your previous >esto ejecutará el último comando que coincida con esa secuencia.

No pude encontrar algo como Ctrl+ Ren Bash para mi ksh y tcsh.

Hemant
fuente
3
Ctrl + r funciona un poco diferente en ksh que Bash. Presione Ctrl + r, luego escriba la cadena que está buscando y presione Entrar . Para buscar lo mismo, presione Ctrl + r e ingrese sin tener que volver a escribir la cadena. Esto está en set -o emacsmodo, por cierto.
Dennis Williamson
@Dennis: +1 :-)
Hemant
1

Hay una manera de usar Ctrl, Rcon tcsh . Agregue lo siguiente en su ~/.cshrc:

bindkey "^r" i-search-back (es solo un signo de intercalación y la letra r)

Ese es el mayor ahorro de tiempo para mí.

nariz grande
fuente
1

respuesta similar a @ephemient, pero puede poner en su .bashrc

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

y escriba parte de la frase, y luego use la flecha arriba / abajo para explorar las opciones más recientes que coinciden. Este es el comportamiento predeterminado de matlab.

Para la mayoría de la gente, si quieres puerto a la configuración de un nuevo sistema, es más fácil de recordar para enganchar sólo su ~/.bashrccontinuación, que usted tiene que enganchar a que~/.inputrc

Matt S.
fuente
0

Sí, existe, al menos si está utilizando zsh. Simplemente comience a escribir el comando y luego presione M-p( ESC p) y encontrará comandos anteriores que coincidan con lo que escribió. Presiónelo nuevamente para encontrar la próxima coincidencia.

dkagedal
fuente
Esta respuesta puede hacer con más explicaciones.
phunehehe