Ejecutar comandos directamente desde Vi / Vim

visudoEl editor Vi/Vim es todo un mundo, existen incluso libros de cientos de páginas que enseñan todos sus secretos y la forma más óptima de trabajar con él, y no hay duda que eso te hará un mejor y más efectivo administrador de sistemas (siempre podemos divertirnos aprendiendo mientras jugamos al juego Vim Adventures). En este caso, gracias a David Martín he descubierto esta característica que resulta extremadamente útil.

Vi permite ejecutar comandos directamente desde el modo normal/command (valga la redundancia…), ya sea simplemente para ver su salida o para pegar el resultado directamente en el fichero en modo edición. Para ejecutar un comando sin añadirlo al fichero que estamos editando, nos colocamos en el modo comando (ya sabéis, tecla ESC, más de una vez por si acaso) y indicamos el comando después de «:!«:

Por ejemplo, quiero ver las últimas 10 líneas del comando dmesg sin salir de Vi:

~
~
~
~
~
~
~
~
~
:! dmesg | tail -10

Y automáticamente el editor queda en segundo plano para mostrar la salida del comando:

:~$ vi test.txt

[   16.194656] vboxdrv: Found 2 processor cores.
[   16.197627] vboxdrv: fAsync=0 offMin=0x1fa offMax=0x8c4
[   16.197759] vboxdrv: TSC mode is 'synchronous', kernel timer mode is 'normal'.
[   16.197763] vboxdrv: Successfully loaded version 4.1.12_Ubuntu (interface 0x00190000).
[   16.238261] vboxpci: IOMMU not found (not registered)
[   16.416345] r8169 0000:06:00.0: eth0: link up
[   16.416582] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   27.344037] eth0: no IPv6 routers present
[   64.770466] audit_printk_skb: 30 callbacks suppressed
[   64.770472] type=1701 audit(1354908230.365:22): auid=4294967295 uid=1000 gid=1000 ses=4294967295 pid=1826 comm="chrome" reason="seccomp" sig=0 syscall=20 ip=0x6c2416 code=0x50001

Press ENTER or type command to continue

Presionando ENTER volvemos al editor. Si lo que queremos por contra es volcar el resultado del comando en el fichero, nos colocamos en la línea que queremos pegarlo, volvemos al modo comando y ejecutamos lo mismo que antes pero añadiendo la letra «r» tras los «:». Pegará el contenido detrás de la posición donde se encuentre el cursor:

~
~
~
~
~
~
~
:r ! dmesg | tail -10

Realmente la r (returning creo) lo que hace es volcar la salida estandar de lo que indiquemos, que puede ser directamente un fichero. En este caso volcará el contenido del fichero /etc/fstab en el fichero que estamos editando:

~
~
~
~
~
:r /etc/fstab 

Probablemente la mayoría ya lo supierais, yo no, y desde luego me está resultando muy útil y ya está dentro de mi rutina de atajos dentro de Vi. ¡A partir de ahora que nadie cierre y abra Vi continuamente para consultar/ejecutar algo mientras trabaja con el editor!