Parece que hay mucha información sobre cómo editar y ejecutar un comando usando su editor usando "edit-and-execute-command (Cx Ce)", pero lo que me gustaría lograr es tomar el comando de shell actual, aplicar cierto filtrado (usando un script) y luego devuélvalo para solicitar más aprobación / cambios manuales antes de la ejecución. ¿Es esto posible con bash?
13
edit-and-execute-command
.Escape
+V
, pero todavía va a ejecutar el comando. En cuanto a la solución, agregaríaecho
en el frente para ejecutarlo imprimiendo el comando en la consola para su revisión.Respuestas:
Última actualización sobre mi experiencia
La parte
0"+y$dd
en el siguiente mapeo es realmente algo en lo que debe pensar cuidadosamente y adaptarlo a su gusto / flujo de trabajo / experiencia.Por ejemplo, con mucha frecuencia me encuentro terminando con varias líneas en el búfer, donde solo quiero ejecutar aquella en la que está el cursor; en este caso puedo usar en
0"+y$dd:%d<CR>
lugar de0"+y$dd
.Y este es solo uno de los escenarios posibles.
Respuesta final para quienes gustan
vim
vim
como suEDITOR
/VISUAL
, de modo que cuandovim
edite una línea de comando, la use para editarla.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
su~/.vimrc
archivo en el mapa Leaderd(que rara vez usará al editar un comando) en la acción "eliminar la línea actual en el+
registro sin la EOL final".+
o el*
registro en la asignación anterior; las formas de pegar en la terminal probablemente diferirán; necesita la+clipboard
opción para que estos registros estén disponibles .vim
editor, presione EscapeLeaderd.Respuesta original
A menudo necesito hacer lo mismo, y lo hago de la siguiente manera. (Normalmente uso el
set -o vi
inbash
, por lo que los puntos 1 y 2 a continuación son diferentes si usaset -o emacs
el valor predeterminado; según su pregunta, parece que los puntos 1 y 2 están unificados en Ctrl+ xseguido de Ctrl+ e, que es más difícil de escribir, en mi humilde opinión .)(Aquí es donde haces la pregunta).
URxvt
.Claramente, esto es solo una solución, que consiste en copiar el comando editado en el portapapeles antes de eliminar todo el comando, para que nada se ejecute al salir del editor; Sin embargo, es lo mejor que puedo obtener por mí mismo.
Actualizar
Como mi
EDITOR
(yVISUAL
) es igual avim
, cuando edito el comando, lo edito envim
.A este respecto, he notado que el búfer se llama
/tmp/bash-fc.random
, donderandom
hay una cadena aleatoria alfanumérica de 6 caracteres.Esto le da espacio a muchas posibilidades, si las usa
vim
como su editor, ya que puede definir algún mapeo en su.vimrc
para ejecutar toda la secuencia Escape0"+y$dd:wq. Por ejemplo, un comando que rara vez usaría al editar una línea de comando es Leaderd; por lo tanto, puede poner el siguientemap
ping en su.vimrc
archivopara que el paso 4 de la receta anterior se convierta
fuente
No es posible hacer eso en Bash / readline pero es posible en zsh usando el
edit-command-line
comando:Ahora pulse Control- x Control- epara abrir su editor, editar línea, deje el editor - verá la línea de comandos actualizada pero no se ejecutará automáticamente.
fuente
Ahora que lo pienso, tal vez una variación de lo que @kenorb sugirió en un comentario es la mejor solución (ya que parece que no existe una solución), si queremos seguir
bash
.Lo que puede hacer es anteponer un
#
(el carácter de comentario enbash
) al comando, en lugar deecho
. Luego, cuando salga del exitor, el comando será ineficaz y solo tendrá que presionar arrow up(o k, si lo usaset -o vi
), eliminar#
y confirmar.Tenga en cuenta que esta estrategia agrega solo unas pocas teclas, por lo que puede ser bastante eficiente, dependiendo de su nivel de escritura.
fuente
Estas piezas pueden acercarte:
a) reemplace el enlace normal para newline newline (ctrl-M)
bind -x '"\C-M":date"
b) tome la línea actual del historial usando
!#
reemplace fecha con cualquier script que desee.
c) editar manualmente
d) si es necesario, empate de alguna manera el
!!:p
que imprime el nuevo comando en la línea de comando pero no lo ejecuta, lo que le permite editarlo manualmente.e) usando ctrl-J enviar comando editado en lugar de una nueva línea
o tal vez no ...
fuente
Hay una opción en bash para modificar el comando del historial sin ejecutarlo. No estoy seguro de que sea posible usar script para esto, no parece probable. Sin embargo, puede realizar modificaciones utilizando modificadores de historial.
Así es como se ve:
fuente
Me gustaría señalarle el marco Composure para Bash (no estoy afiliado a él): https://github.com/erichs/composure
Proporciona
draft
yrevise
funciones que parecen que podrían ayudar con lo que está tratando de hacer. Aquí hay una cita (larga) del archivo Léame del proyecto:fuente
No parece posible con un atajo de teclado, al menos:
fuente