Bash historial de búsqueda, parcial + flecha hacia arriba

146

He buscado, pero no he encontrado nada al respecto. Estoy buscando una funcionalidad en bash, usando un terminal.

Hace mucho tiempo, tenía un usuario en un sistema Debian, y un amigo me configuró con una conveniente función de búsqueda de historial (creo que usé tcsh entonces), donde escribiría el comienzo de un comando anterior, presionar la flecha hacia arriba, y haría una búsqueda, basada en la cadena parcial.

Por ejemplo, si mi historia es:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

Y escribo ., y pulse la flecha hacia arriba, me gustaría mostrar: ./script.pl arg1. Presiónelo nuevamente y se mostrará ./script.pl, etc.

Muy parecido a realizar una grep.bash_history. ¿Hay alguna manera de obtener esta funcionalidad?

TLP
fuente
posible duplicado de iPython Like Command History for Shell
Marcel Stimberg
1
@Marcel Parece que podría ser la misma respuesta, lo vi en la búsqueda, pero no lo relacioné con mi pregunta, con las palabras clave iPython y Shell.
TLP

Respuestas:

197

Pon las siguientes líneas en tu ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Las líneas que comienzan con #son comentarios. No puedo recordar lo que está hacia atrás y hacia adelante. Experimenta con eso. Tal vez tienes que cambiar hacia atrás y hacia adelante.


Un poco de información de fondo:

Bash está usando readline para manejar la solicitud. ~/.inputrces el archivo de configuración para readline. Tenga en cuenta que esto también tendrá efecto en otro software que use la biblioteca readline, por ejemplo IPython .

Lea el manual de bash para obtener más información sobre readline. Allí también puede encontrar más comandos de línea de lectura relacionados con el historial .

Para obtener los códigos de escape para las teclas de flecha, puede hacer lo siguiente:

  1. Comience caten una terminal (simplemente cat, sin más argumentos).
  2. Escriba las teclas en el teclado, obtendrá cosas como ^[[Aflecha hacia arriba y flecha ^[[Bhacia abajo.
  3. Reemplazar ^[con \e.
lesmana
fuente
1
Genial, pero esta solución deshabilita los atajos ctrl-left / ctrl-right.
Eyal
¿Alguien puede decirme cómo puedo lograr lo mismo para hacer?
Hitesh Kumar
@lesmana, daría puntos extra solo por la parte del gato
Mike D
Secundando @Eyal, ¿alguien tiene consejos sobre cómo puedo tener esto pero preservar los atajos ctrl-left / ctrl-right?
kbrose
66
Para conservar todos los valores predeterminados $include /etc/inputrc, agregue , preferiblemente en la primera línea.
Tulio Casagrande
31

Cree un archivo llamado setup_readline.sh con el modo 644 en /etc/profile.d/ con el siguiente contenido, inicie sesión y verifique sus claves preferidas:

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

Creo que es la mejor manera de hacer esto. Principalmente si utiliza sistemas de gestión de configuración como chef, títeres, etc.

¡Y la configuración del sistema sigue intacta!

usuario287613
fuente
44
Curiosamente, el ~ / inputrc no funcionó para mí, pero poner estos comandos en .bash_profile sí.
Joe
1
.inputrc no existe en mi carpeta de inicio y prefiero tener este tipo de configuración en .bashrc de todos modos, así que solo puedo llevar un archivo para mi configuración. Entonces esta es probablemente una mejor respuesta que la aceptada.
Shital Shah
.inputrc funciona fabulosamente para mí, pero no después de cargar screen. Lo extraño es que otros atajos .inputrc funcionan, pero no estos. Entonces uso ambas soluciones ahora.
Orwellophile
Esto es súper útil cuando, por ejemplo, inicia sesión en un servidor para hacer cosas y se olvida de esto y no desea editar y volver a cargar el ~ / .inputrc en el servidor.
danmactough
13

Ctrl + R le dará este tipo de funcionalidad. Comience a escribir un comando parcial y aparecerá uno antiguo que puede navegar con las flechas hacia arriba y hacia abajo. Más información: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell

Andrew Moss
fuente
2
Gracias por su respuesta. Sí, lo he intentado, pero me parece un poco ... quisquilloso. No me permitirá desplazarme por los comandos que comienzan con el parcial, solo muestra el primero. También busca el comando completo para el personaje, que es inútil.
TLP
55
@TLP, repetir golpesCtrl+r
akostadinov
4

Para completar la respuesta de lesmana con respecto a "~ / .inputrc" que debo crear en mi Trusty 14.04, verifique / agregue "~ / .bashrc" (la primera línea ya existe en mi "~ / .bashrc"):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Ya está explicado en francés en https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .

bcag2
fuente
2
Este comando básicamente le indica a bash que agregue inmediatamente el comando al archivo de historial en lugar de esperar a que finalice la sesión. Es útil si tiene muchas terminales abiertas y no desea perder el historial en una, pero de lo contrario no es necesario. digitalocean.com/community/tutorials/…
Shital Shah
3

Tal vez desee probar https://github.com/dvorka/hstr que proporciona un filtrado simple y de varias líneas del historial de Bash que se basa en una métrica (cuándo, con qué frecuencia y la longitud de los comandos son importantes): puede usar teclas de flecha para navegar fácilmente por el historial:

ingrese la descripción de la imagen aquí

Puede ser fácilmente vinculado a Ctrl-ry / oCtrl-s

Martin Dvorak
fuente
0

La siguiente solución combina y extiende algunos de los enfoques mencionados anteriormente: agregue las siguientes líneas a su ~/.bash_aliasesarchivo (no es necesario ~/.inputrc) para lograr el siguiente comportamiento:

  1. subir / bajar en el historial (solo entradas con el mismo prefijo) presionando CTRL + ARRIBA y CTRL + ABAJO. Esto puede coexistir con la funcionalidad estándar de subir / bajar en el historial completo solo con ARRIBA y ABAJO
  2. saltar a la palabra siguiente / anterior en una línea de comando presionando CTRL + DERECHA y CTRL + IZQUIERDA
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Vuelva a iniciar sesión en el shell (o ejecute source ./bash_aliases) para aplicar los cambios.

usuario27164
fuente