Esta receta aplica a un escenario en el que hemos recogido en un fichero una serie de comandos que queremos ejecutar.

Podemos ejecutarlos mediante bash, pero en este caso queremos revisar la salida de cada comando. También es posible que falle alguno de ellos, y queremos poder volver a ejecutarlo, o realizar pruebas más tarde.

En este ejemplo, tenemos una serie de comandos de aptitude para downgradear versiones de algunos paquetes que quizá hayamos instalado por error.

Un extracto de este fichero sería algo parecido a esto:

aptitude install libcap2=2.11-2
aptitude install libcomerr2=1.41.3-1
aptitude install libconsole=1:0.2.3dbs-65.1
aptitude install libexpat1=2.0.1-4+lenny3
aptitude install libfontconfig1=2.6.0-3
aptitude install libgdbm3=1.8.3-3
aptitude install libgpg-error0=1.4-2
aptitude install libgpm2=1.20.4-3.1


Mediante las características de ViM, podemos facilitar y semi-automatizar la tarea de ejecución, teniendo siempre control de los resultados de cada comando y la opción de actuar si se da el caso.

¿Qué vamos a utilizar?

Preparación

Lo que vamos a hacer es grabar una macro que consiste en eliminar la línea donde está posicionado el cursor, y utilizar el registro donde se guarda dicha eliminación para ejecutar el comando.

A continuación, los comandos de ViM para preparar la macro.

Deben ejecutar desde el modo normal, y sin ningún espacio (en este caso se ha desglosado por claridad):

qq # comenzar a grabar la macro, en el registro 'q'
dd # eliminar la línea bajo el cursor. Queda guardada en el registro '0' y en el '"'
:!<C-r>0 # En modo ex, utilizar ! para ejecutar comandos, insertar el contenido del registro 0 (Control-r 0)
<backspace> # Si existe, eliminar el carácter de final de línea. Se muestra como '^M'
<CR> # Ejecutar por primera vez el comando


La ejecución podría incluír alguna interacción con el usuario (apretar Y, o <CR>, o algo similar), que queda también grabado en la macro. Al volver de la salida de ejecución volveremos a apretar ‘q’ para parar la grabación de la macro. Si hemos interactuado en la shell, habrá que eliminar las teclas correspondientes de la macro, y lo podemos hacer editando el registro ‘q’, donde ha quedado grabada.

Para eso, desde el modo normal, copiaremos el contenido de la macro en un buffer alternativo (o al final del mismo fichero), lo editaremos como si fuera un texto normal, y volveremos a guardar el contenido en el mismo registro.

G # ir al final del fichero
:put q # Desde modo ex, pegar el contenido de la macro


Deberíamos tener una línea similar a esta:

dd:!^R"<80>kb^M<contenido extra>

Simplemente eliminamos lo que no queramos que se incluya en la macro y guardamos la línea en el registro ‘q’ de nuevo (eliminándola también del fichero):

"qdd

Primera ejecución

La primera vez que la ejecutemos, lo haremos como @q (indicando el registro q, que es donde hemos grabado la macro). Realizará la ejecución, y podremos interactuar con el comando ejecutado (en este caso, aptitude). La ejecución también incluye el borrado de línea, así que automáticamente iremos vaciando el buffer con los comandos pendientes.

Si alguno de los comandos no funciona correctamente (o en el caso de aptitude hay problemas de dependencias y queremos dejar su resolución para más adelante), siempre podemos recuperar el contenido anterior de la línea (se ha guardado en los registros por defecto, el ‘0‘ y el ‘‘ debido a la eliminación mediante ‘dd’).

Repetición de la ejecución del resto de líneas

Una vez comprobemos que la macro funciona correctamente, podemos repetirla mediante ‘@@’, que repite la última macro ejecutada (más rápido y cómodo que @q).

También se puede automatizar para que se ejecute por cada línea del fichero, pero en este caso nos interesa supervisar todas las ejecuciones.

[1] “Practical Vim”, de Drew Neil

TAGS: comandos, vim

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*