¿Cómo puedo recuperar un comando de historial numerado para editar?

17

Con frecuencia busco cambios con history | grep 'string'

Recibo una lista de comandos en mi historial, junto con el número de línea del historial), p. Ej.

history | grep 'git'

  755  git status
 1535  git push origin master
 1570  git merge origin/one-146
 1667  git reset --hard origin/master

Ahora puedo recordar y ejecutar un comando de una vez con !nnn, por ejemplo:

!755
git status
# On branch master
nothing to commit, working directory clean

Mi pregunta es: ¿cómo puedo recordar un comando de historial numerado y permanecer en la línea de comandos para editarlo y no ejecutarlo de inmediato 'como está', de la manera que lo !hace, para que pueda cambiar un par de cosas antes de regresar?

Michael Durrant
fuente

Respuestas:

12

Desde entonces he adoptado otro enfoque para esto: usar ![line-number]:p

Esto imprime la declaración y la agrega al historial, pero en realidad no la ejecuta. Luego hago una flecha hacia arriba y la cambio como lo desee.

Combino esto con mi hgalias ( alias hg='history | grep ') para recuperar comandos de historial basados ​​en algún texto.

Ejemplo:

$ hg checkout

17140   git checkout README.rdoc
17143   git checkout master
17201   git checkout README.rdoc
17204   git checkout master
17923   git checkout .bashrc
18151   git checkout v311

Yo uso este, además de ctrl- r(historial inversa) porque a veces prefiero ver una lista inmediata de todas las posibilidades de una cadena dada en lugar de sólo la salida el 1 de línea que ctrl- respectáculos. Después hg [string], haría lo ![line-number]search_stringque se hg checkoutmuestra arriba.

Michael Durrant
fuente
8

Si configura la histverify opción , por ejemplo

shopt -s histverify

entonces todas las sustituciones del historial se muestran para su edición en lugar de ejecutarse inmediatamente. Luego, deberá presionar Enterdos veces en lugar de una vez después de escribir !755para ejecutar el comando.

Puede insertar texto arbitrario en la lista del historial con history -s. Combine esto con fc -nlpara enumerar una entrada de historial específica.

history -s "$(fc -nl 755 755)"

luego presione Uppara recordar cuál es ahora la última entrada del historial.

Gilles 'SO- deja de ser malvado'
fuente
6

Puede buscar en el historial con Ctrl+ R. Si la entrada del historial es larga, use el mouse (no el teclado, que detiene la búsqueda) para copiar y pegar parte del comando para volver a editar.

Como comentó @rijsg, puede usar las flechas (izquierda y derecha) o teclas equivalentes para detener la búsqueda y comenzar a editar.

Zelda
fuente
2
Cualquier tecla de flecha o comando equivalente ( Ctrl-apor ejemplo) detendrá la búsqueda dejando la entrada del historial actual en el símbolo del sistema, sin ejecutarla. Esto puede o no ser suficiente, dependiendo de lo que @Michael quiera.
njsg
2

Si configura su archivo .bashrc para usar el editor vi en la línea de comando, hará que las ediciones de la línea de comando sean mucho menos complejas.

Primero, una vez que "set -o vi" está habilitado, simplemente puede presionar "<esc> k" , luego seguir presionando "k" para subir el archivo del historial, si pasa una entrada, use "j" a bajar .

NOTA: cuando se usa vi, hay dos modos: comando y edición para ingresar al modo de comando, presione ESCAPE KEY ONCE, luego a, A, i, I, etc. para insertar.

Teclado simple en vi: izquierda = h, abajo = j, arriba = k, derecha = l http://linuxmeister.net/vi/vi-Summary.jpg

He agregado todas las entradas necesarias para que esto funcione en: http://linuxmeister.net/Notes/bashrc-simple.html

Entonces, en base a la información muy útil anterior, pude usar "historial" y RECUPERAR una línea de "historial", sin ejecutarla. (¡GRACIAS POR ESE POST!)

si shopt aparece en la lista e histverify está "apagado" a! EJECUTARÁ inmediatamente,

si ha agregado a su .bashrc, o ha escrito: shopt -s histverify , entonces a! permite una edición, por ejemplo:

history
    1  more .bashrc
    2  history
    3  shopt
    4  . ./.bashrc
    5  shopt | grep hist
    6  history
    7  alias
    8  history
    9  shopt
   10  history

->! 5

cuando presiono! 5 aparece el siguiente comando, pero NO se ejecuta

### si histverify está "activado".

shopt | grep hist
cmdhist         on
histappend      on
histreedit      off
histverify      on
lithist         off

Recuerde que Linus y Richard crearon herramientas Linux y GNU para aprovechar UNIX. El editor vi (creado por Bill Joy) es una de las mejores herramientas para dominar, ya que se encuentra en CADA distribución de UNIX y Linux.

Todos los demás editores de línea de comandos deben cargarse y requieren software adicional. Usar una GUI en Linux (que no sea Firefox, Thunderbird y OpenOffice) es como remolcar tu Diesel 4x4 con un VW Beetle de 1968 ... funcionará, pero seguro que no tiene ningún sentido.

Recuerde lo que dijo Kernigan sobre una GUI, "lo que ves es todo lo que obtienes".

LinuxMeister
fuente
-1
echo !number

luego presione la flecha hacia arriba, elimine la palabra echoy edite el resto; presione enter para ejecutar.

Andrzej
fuente