Con BASH después de "desplazarse" hasta un comando anterior ... ¿cómo pasar al siguiente en esta historia?

59

Disculpas, este título no es el más elegante que he ideado.

Pero supongo que mucha gente se habrá preguntado esto, y mi pregunta puede ser un engaño ... todo lo que puedo decir es que no lo he encontrado.

Cuando digo "desplazarse" hacia arriba, me refiero a usar la tecla "flecha hacia arriba" en el teclado, que obviamente lo desplaza hacia arriba a través del historial, comenzando con el comando más reciente.

Entonces encuentras un comando, tal vez 30 comandos atrás ... y lo ejecutas. Y luego quieres ejecutar el comando que originalmente vino después de él ... ¿hay una manera ágil de hacer esto? ¿O cómo hacen esto los que dominan BASH?

Mike roedor
fuente

Respuestas:

96

Ejecutar el comando con Ctrl+ en olugar de Enterejecutará un comando desde el historial y luego pondrá en cola el siguiente en lugar de volver al frente del historial de bash.

Jon Reinhold
fuente
2
¡Acabo de probar esto en mi propio bash ejecutándose en un xterm en NetBSD, y no funciona! ¿Hay configuraciones que puedan influir en esto? No tengo un archivo .inputrc. Co no se menciona en la página del manual de readline (3).
Rhialto
@Rhialto ¿Está utilizando la viedición de línea (habilitada con set -o vi) o emacs? Porque, por Ctrl-Olo que puedo ver, no funcionará con el primero.
Capa B
... pero esto se puede remediar con el comando: bind "\C-o":operate-and-get-next(o añadir todo lo que después bindde ~/.inputrc)
B Capa
1
Descubrí cuál es mi problema: ^ O se toma como el carácter Flush Output (no es compatible con Linux), y readline no deshabilita esto mientras está activo. Proporcioné un parche simple, pero el mantenedor de bash y readline mantiene que esto no es un error. Estoy en desacuerdo. Ver lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto
19

La respuesta de Jon Reinhold es excelente, pero hay una solución mucho más poderosa que sugeriré. También tengo un comentario sobre un error en la respuesta de Jon, pero no tengo suficiente reputación para poder comentar directamente, así que @Jon Reinhold, si lees esto, dirígete mi comentario a continuación.

Bash incluye un comando fc, que toma como parámetros los números de línea de la lista del historial de bash. Luego abre su editor predeterminado con esas líneas como texto. En ese punto, opcionalmente puede editar las líneas. Luego, cuando salgas del editor, bash ejecuta esas líneas.

Un ejemplo de una edición que quizás desee hacer es agregar a todos menos a la última línea algo así como "; lea -p" siguiente ... ". Esto hará que bash ejecute cada línea y le indique antes de continuar.

Comentario para Jon Reinhold: Gran respuesta, pero debe calificarlo porque si el usuario ha configurado la variable bash HISTCONTROL para incluir erasedups, entonces, después de realizar C-oel usuario, se confundirá porque en lugar del siguiente comando esperado en el historial que se muestra, el siguiente será mostrado. Esto se debe a que bash ha eliminado la instancia original del comando ejecutado y, por lo tanto, todos los comandos posteriores han cambiado una línea, es decir. a un número de índice inferior en la lista del historial.

usuario1404316
fuente
gracias, al intentar encontrar la respuesta buscando, me encontré con el comando "fc". Para mí, esto representa la siguiente etapa en los lentos pasos de un neófito de BASH en el camino de la gloria hacia el CONOCIMIENTO. Quería el primer paso de bebé.
Mike roedor
3
@mikerodent No. Entonces sucede fcantes Ctl-oy a bashsí mismo. (Contrariamente a esta respuesta, también es menos útil.)
kubanczyk
1
El problema con erasedupses claramente un error bash ( podría haber sido provisto para esta situación). Es bueno saberlo, sin embargo.
alexis
2
@kubanczyk Eso está a debate. Si se trata de un comando complejo y complicado, dependiendo de lo que necesite arreglarse, sería mucho más rápido para mí usar el editor de mi elección para actualizar el comando. También sería más fácil.
Pryftan
14

Otra forma de lograr su comportamiento deseado sería familiarizarse con los accesos directos de la línea de lectura de bash (de los cuales CTRL, ocreo) y la búsqueda del historial de bash.

Búsqueda de la historia

CTRL- lo rlleva a la búsqueda del historial de comandos de bash, donde puede comenzar a escribir el comando que está buscando y bash completará automáticamente el comando por usted. La funcionalidad de autocompletar es realmente bastante buena. Cuando el comando que desea ejecutar está en la línea de entrada, puede ENTERejecutar el comando o presionar CTRL- epara mover el cursor al final de la línea de comando y salir del modo de búsqueda del historial.

Lo bueno de CTRL- een este punto es que el búfer de historial está configurado contextualmente para este comando. Los comandos siguiente y anterior ahora son los que se ejecutaron justo antes y después de la línea que la búsqueda de historial localizó para usted. Puede presionar las flechas hacia arriba o hacia abajo y tomar el siguiente comando.

La búsqueda de historial es muy poderosa y una excelente manera de evitar el uso de la flecha hacia arriba para volver al comando en primer lugar. Una búsqueda rápida en el historial puede ahorrar mucho tiempo buscando manualmente en el historial y luego puede continuar CTRL, ocomo Jon señaló anteriormente.

Readline Short Cuts

Si está buscando aumentar su bash-fu en general, le recomendaría que pruebe los atajos de línea de lectura para las teclas de flecha. Puede encontrar que son más convenientes y le permiten aumentar su velocidad de escritura, pero, por supuesto, YMMV. Aquí hay algunos más:

  1. CTRL- npara el siguiente comando (flecha hacia abajo equivalente)
  2. CTRL- ppara el comando anterior (flecha arriba equivalente)
  3. CTRL- bretroceder un personaje (equivalente a la flecha izquierda)
  4. CTRL- freenviar un personaje (flecha derecha equivalente)

Estos atajos de línea de lectura (junto con CTRL- aprincipio de línea y CTRL- efinal de línea) aumentarán su velocidad y eficiencia en la línea de comando imo.

111 ---
fuente
2
No lo sé. Creo que usar las teclas modificadoras es más lento que las flechas o cualquier otra pulsación de una sola tecla. En cuanto a EOL / etc. Tiendo a usar las teclas de inicio / fin (stty -a también muestra algunas cosas bastante útiles, por supuesto).
Pryftan
@Pryftan Bastante justo, la última oración se presenta como una opinión (ver 'imo'). Creo que permanecer en la fila de inicio del teclado a largo plazo es una buena estrategia para trabajar en la terminal o en cualquier otra tarea intensiva de escritura. Algunas personas tienen teclados donde las teclas de flecha están más cerca de los otros caracteres, en ese caso quizás los atajos de línea de lectura no sean una conveniencia convincente. Editaré la respuesta para que este último punto sea más claramente una declaración de opinión.
111 ---
1
@datUser Tbh ​​Me perdí el 'imo' (o si no lo hice, descuidé considerarlo, completamente posible). Sin embargo, lo que es cierto es que la búsqueda inversa es útil (tiene un +1) si funciona para usted. ¡Por supuesto, fc también es algo (como ya se señaló) y también lo está usando! (etc.) Muchas maneras de pelar un gato en Unices. En cuanto a los teclados, eso también es cierto: tengo un teclado Unicomp (me encanta y me trae recuerdos) pero, por supuesto, también hay otros teclados para tener en cuenta sin mencionar Dvorak. Al final
cuantas