Posteriormente a consultar expertos en el tema, programadores de varias ramas y profesores dimos con la respuesta al dilema y la plasmamos en esta publicación.
Solución:
Siempre que haya editado una entrada del historial pero no haya presionado Ingresar sin embargo, para volver a la entrada original, presione repetidamente control+_ – el undo
comando – hasta que no haga más cambios. Has vuelto a la entrada original.
Vuelva al comando original cuando haya realizado varios cambios en la línea:
revert-line (M-r)
Undo all changes made to this line. This is like
executing the undo command enough times to get back to the beginning.
M
es el meta key, cual es altr para mí.
Información gratuita pero útil
Cuando usted tener ejecutado un comando como OP había hecho anteriormente (sucede), no hay nada que “deshacer” porque los comandos son manejados y recordados por la biblioteca GNU Readline y no están escritos en $HISTFILE
hasta que salga el caparazón. La razón por la que menciono esto es porque no puedes simplemente grep
el $HISTFILE
como cabría esperar y puede que no sea ideal salir del shell.
Así que aquí hay un par de opciones para evitar que tenga que desplazarse hacia atrás a través de todos los comandos de readline anteriores.
Si recuerdas algo del comando, imprenta control+r y escriba lo que recuerda para buscar a través de comandos anteriores que contienen ese string. Prensado control+r de nuevo mostrará el siguiente más reciente, buscando hacia atrás.
Por ejemplo, escriba ls -l
entonces control+r tantas veces como sea necesario para encontrar el comando anterior que busca. Si se desplaza más allá de él, control+ s buscará hacia adelante desde la posición actual.
El fc
comando integrado bash Es útil enumerar los números de índice junto con los comandos readline anteriores.
fc -l -100
enumerará los 100 comandos anteriores en readline.
Además, si OP sabe que está buscando un ls -l
comando, podría canalizar la salida a grep
tal como: fc -l -100 | grep 'ls -l'
Esto debería generar una lista de ls -l
comandos precedidos por un número de índice. La salida se ve así:2065 ls -l
Ahora puedes usar el designador de eventos !n
donde n
es el número de índice. En este ejemplo, ejecutando !2065
se expandirá a ls -l
.
Aunque no ayuda después del hecho, cualquiera que busque preservar el historial de comandos reciente al modificar comandos anteriores debería ver el HISTORY EXPANSION
Sección de man bash
. A continuación, se muestran algunos métodos alternativos para modificar comandos antiguos sin sobrescribir el historial.
El Event Designators
sección muestra cómo puede editar fácilmente string desde el comando utilizado más recientemente.
^string1^string2^
Quick substitution. Repeat the previous command, replacing string1 with string2. Equivalent to
``!!:s/string1/string2/'' (see Modifiers below).
Ejemplo:
$ echo foo
foo
$ ^foo^bar
echo bar
bar
Los comandos más recientes ahora mostrarán:
echo foo
echo bar
El ejemplo anterior también explica cómo usar sed
para reemplazar un string en un designador de evento.
!-n Refer to the current command minus n.
Entonces, si hay 3 comandos en el historial echo foo
entonces usarías:!-3:s/foo/bar
Tenga en cuenta que los designadores de eventos aparecerán en su historial como el comando ejecutado, en este caso echo bar
. No aparecerá en la historia como !-3:s/foo/bar
.
Simplemente lanzando eso, ya que parece estar estrechamente relacionado, incluso si es más un “no hacer” que la solución “deshacer” que OP está buscando.
La variable readline revert-all-at-newline
, disponible desde bash-3.2, logra casi el efecto deseado.
Si está configurado, presionar enter en cualquier línea (podría ser un comando diferente, o incluso una línea vacía) revertirá las entradas del historial que fueron editadas pero no ejecutadas (como en el ejemplo de la pregunta).
Esto se puede configurar con
set revert-all-at-newline on
en ~/.inputrc
.
o
bind 'set revert-all-at-newline on'
en ~/.bashrc
.
valoraciones y reseñas
Si para ti ha resultado de ayuda nuestro artículo, sería de mucha ayuda si lo compartes con más desarrolladores de esta forma contrubuyes a extender nuestra información.