Usando el historial de bash para obtener un comando anterior, cópielo y luego 'ejecútelo' pero con el comando comentado

Solo una pregunta para mejorar mi bash habilidades. Siempre hago esto:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

Luego puedo ejecutar el comando que encontré haciendo:

!123

Sin embargo, a menudo quiero hacer esto:

some_long_command1foobar

Es decir, cambie el comando antes de ejecutarlo. ¿Puedes usar bash para ejecutar este comando en su lugar?

#some_long_command1

así se comenta.

Entonces no tengo que usar mi mouse para resaltar el comando, editarlo y luego ejecutarlo (solo puedo usar el teclado, más rápido).

Supongo que podría escribir un script para hacerlo, pero es posible que ya haya una funcionalidad integrada en alguna parte....?

preguntado el 12 de junio de 12 a las 17:06

La forma más fácil: poner bind Space:magic-space en tu perfil de bash. Luego, presionando Space se expandirá !123 dentro some_long_command1. -

@cortés: ¡Gracias! Ese era nuevo para mí. Muy útil. -

10 Respuestas

Sugeriría que en lugar de usar el comando de historial, use ctrl+r y comienza a escribir ese comando. Cuando presiona una tecla de flecha como si fuera a modificarla, dejará de reconocerse como autocompletado y le permitirá editar antes de ejecutar.

ACTUALIZAR: también, si desea recorrer los diferentes comandos que contienen la cadena que acaba de escribir, siga presionando ctrl+r

respondido 10 mar '14, 10:03

Si usa combinaciones de teclas vi (set -o vi), también puedes usar / para buscar en el historial y editarlo. - Guillermo Pursell

Una característica más poderosa es permitir escribir un comando parcial o parte de una ruta que estaba en un comando y luego usar las flechas para navegar por el historial. Buscar opciones de historial-búsqueda-hacia atrás, historial-búsqueda-adelante para bash - DavidC

DavidC, he visto a otros hacer esto, pero no funciona para mí. Cuando escribo las primeras letras de un comando, luego presiono la flecha hacia arriba, ignora lo que estaba escribiendo y pasa por el historial como si no hubiera escrito nada (del más nuevo al más antiguo). ¿Cómo configura su shell para lograr esto? - daniel watrous

es triste que el arriba abajo no se desplaza por las coincidencias sino que sale inmediatamente de la búsqueda. Hubiera preferido que se desplazara por los partidos con arriba abajo (lo que indica que todavía estoy buscando el comando que quiero), y solo tengo izquierda derecha salir de la búsqueda (lo que indica que he encontrado el comando que quiero y ahora estoy listo para editarlo). - ADTC

@ADTC Acabo de descubrir una manera de hacer lo que tú (y yo) queremos: presiona ctr+r, comience a escribir, luego, cuando desee encontrar todos los comandos que contienen eso, simplemente siga presionando ctrl+r. En otras palabras, lo que quiere hacer con arriba/abajo se hace (al estilo de todos contra todos) con ctrl+r - Miquel

En realidad, solo puede agregar :p al comando para imprimirlo sin ejecutarlo realmente. Por ejemplo:

$ ls -la
$ !!:p

Imprimirá ls -la como el comando anterior sin ejecutarlo, y simplemente puede presionar (arriba) para encontrarlo y editarlo.

También puedes hacer

!123:p

para imprimir el comando 123 como su comando anterior.

Respondido el 17 de diciembre de 14 a las 03:12

+1 La mejor respuesta, ya que permite que los comandos de historial habituales respondan al OP: !mycmd:p. Si tiene los comandos vi activados en Bash, entonces la respuesta de Pursell es igual de buena o mejor. Ctrl-r, como lo menciona Miquel, es el siguiente mejor. - Brent Fausto

Si el 123 no está al principio de la línea, puede hacer: !?123?:p - Udi

También puedes probar fc comando para editar el comando en el historial.

Wiki dice,

f.c. es un programa estándar en Unix que enumera o edita y vuelve a ejecutar comandos ingresados ​​previamente en un shell interactivo. fc es un incorporado comando en el golpear cáscara; ayuda mostrará información de uso.


Aparte de búsqueda incremental inversa(Ctrl+R), tenemos algunos más golpear atajos:

Desde man bash:

historia previa (Cp)
    Obtenga el comando anterior de la lista del historial, retrocediendo en la lista. 
historia siguiente (Cn)
    Obtenga el siguiente comando de la lista del historial, avanzando en la lista. 
comienzo de la historia (M-<)
    Vaya a la primera línea del historial. 
fin-de-la-historia (M->)
    Ir al final del historial de entrada, es decir, la línea que se está ingresando actualmente. 
historial de búsqueda inversa (Cr)
    Busque hacia atrás comenzando en la línea actual y moviéndose "hacia arriba" a través del historial según sea necesario. Esta es una búsqueda incremental. 
historial de búsqueda hacia adelante (Cs)
    Busque hacia adelante comenzando en la línea actual y desplazándose 'hacia abajo' a través del historial según sea necesario. Esta es una búsqueda incremental. 
Historial de búsqueda inversa no incremental (Mp)
    Busque hacia atrás en el historial comenzando en la línea actual mediante una búsqueda no incremental de una cadena proporcionada por el usuario. 
historial-de-búsqueda-hacia-adelante-no-incremental (Mn)
    Busque hacia adelante en el historial mediante una búsqueda no incremental de una cadena proporcionada por el usuario.
yank-nth-arg (MCy)
    Inserte el primer argumento del comando anterior (generalmente la segunda palabra en la línea anterior) en el punto. Con un argumento n, inserte la palabra n del comando anterior (las palabras del comando anterior comienzan con la palabra 0). Un argumento negativo inserta la enésima palabra desde el final del comando anterior. Una vez que se calcula el argumento n, el argumento se extrae como si se hubiera especificado la expansión del historial "!n".
tirar-último-argumento (M-., M-_)
    Inserte el último argumento del comando anterior (la última palabra de la entrada del historial anterior). Con un argumento, compórtate exactamente como yank-nth-arg. Las sucesivas llamadas a yank-last-arg retroceden a través de la lista de historial, insertando el último argumento de cada línea a su vez. Las funciones de expansión del historial se utilizan para extraer el último argumento, como si se hubiera especificado la expansión del historial "!$". 
shell-expand-line (MCe)
    Expande la línea como lo hace el caparazón. Esto realiza la expansión de alias e historial, así como todas las expansiones de palabras de shell. Consulte EXPANSIÓN DE LA HISTORIA a continuación para obtener una descripción de la expansión de la historia. 
historia-expandir-línea (M-^)
    Realiza la expansión del historial en la línea actual. Consulte EXPANSIÓN DE LA HISTORIA a continuación para obtener una descripción de la expansión de la historia.
insertar-último-argumento (M-., M-_)
    Un sinónimo de yank-last-arg. 
operar-y-obtener-siguiente (Co)
    Acepte la línea actual para su ejecución y obtenga la siguiente línea relativa a la línea actual del historial para su edición. Cualquier argumento es ignorado. 
comando de edición y ejecución (C-xC-e)
    Invoque un editor en la línea de comando actual y ejecute el resultado como comandos de shell.

Respondido 13 Abr '17, 13:04

!123:gs/old/new/

Ejecutará el comando 123 reemplazando la cadena 'antiguo' con la cadena 'nuevo'.

Respondido el 12 de junio de 12 a las 17:06

Puede acceder al modo de edición presionando M-^ (opción-shift-6 en una Mac).

Escribe esto:

!123M-^

Y estarás editando el comando #123. Es algo así como usar ctrl-r, pero comenzando con la sintaxis de signos de exclamación.

Respondido 11 Feb 13, 22:02

Poder M-^ volver a vincularse a algo más amigable con los dedos? - Resplandor

En lugar de usar el history ordenar, vincular history-search-backward/history-search-forward a atajos de teclado que se pueden recordar fácilmente (prefiero RePág/RePág). Para hacer eso, pon esto en tu .inputrc archivo:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

Para obtener <key code>, tipo Ctrl-V <key> en el caparazón, y reemplace el arranque ^[ con \e en lo que sea que se haya producido.

Después de configurar esto, puede simplemente escribir some y presione PgUp para obtener some_long_command. Si necesitas some_long_command with_some_arg pero hay un comando similar some_long_command with_some_other_arg más adelante en el historial, puede desplazarse hasta llegar a él escribiendo some y luego presionando RePág repetidamente, o puede escribir some, presione RePág, mueva el cursor a donde los dos comandos comienzan a diferir, escriba algunos caracteres y presione RePág una vez más. Esta capacidad de desplazarse rápidamente por las páginas/diferenciar entre comandos similares hace que, en mi opinión, sea una herramienta mucho más cómoda que Ctrl-R.

Respondido 20 Feb 13, 15:02

También puedes poner

shopt -s histverify

en tu .bash_profile, lo que hace que cualquier expansión del historial aparezca en su línea de comandos sin ejecutarla, lo que le permite editar antes de hacerlo.

Respondido el 12 de junio de 12 a las 17:06

Es posible que desee probar el historial similar al "cuadro de sugerencias" https://github.com/dvorka/hstr - lee el historial de Bash y permite una navegación rápida.

hh

Para obtener el último comando, simplemente escriba hh, navegue hasta el comando y use la flecha derecha para obtenerlo en la línea de comando (donde puede editarlo y/o agregar un comentario).

contestado el 11 de mayo de 15 a las 13:05

^p para obtener el último comando escrito en Unix/solaris

Respondido 11 Feb 14, 14:02

poner

alias r='fc -s'

en tu .bashrc (directorio de inicio), entonces puede simplemente escribir

r <whatever>

en el símbolo del sistema y ejecutará una copia de la última <whatever> comando (mismos parámetros) que está en su historial. simplemente presione la flecha hacia arriba para ver lo que ha ejecutado si siente la necesidad.

respondido 27 nov., 16:20

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.