¿Cómo puede configurar la salida de un comando ejecutado en el terminal a una variable después de que se haya ejecutado?
Fondo
(Puede omitir si no necesita el fondo) Ejecuto VirtualBox VM y hago mucho desde la línea de comandos, especialmente cuando soy remoto. VBoxManage
requiere un UUID o el nombre de la máquina virtual para interactuar con él. Por ejemplo, si quisiera apagar una máquina virtual, la sintaxis sería (tengo un alias configurado para VBoxManage como vbm):
vbm controlvm <vmname>|<UUID> poweroff
Esto es bastante fácil si tiene nombres de VM que no tienen espacios o caracteres especiales como "Client X Web Dev Server". Hago esto para poder aprovechar nombres descriptivos. Entonces, la compensación es que uso el UUID. Para hacer esto, creé otro alias que "cortará" la salida solo al UUID. Por ejemplo, si estoy buscando mi "Fred Web Dev Server" (soy un fan de los Picapiedra), ejecuto el comando:
vbm list vms
Mi salida es la siguiente (lista abreviada):
"Fred - FreeBSD 10.2" {f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a}
"FreeBSD 10.2 Master" {ae2a2d61-25e5-4b5e-b455-1b2f60b49157}
"Windows 7 Pro VL" {62bfbca1-9fb4-4758-aeac-2777f2614ffd}
"Windows 10 Pro" {46b285c3-cabd-4fbb-92fe-c7940e0c6a3f}
Por lo tanto, para interactuar con "Fred", solo emito el comando:
vbm list vms | grep Fred
y como era de esperar, me sale:
"Fred - FreeBSD 10.2" {f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a}
Luego lo canalizo a otro alias, vmc
, que emite un comando "anidado" cut
: cut -f 2 -d { | cut -f 1 -d }
. Mi resultado es solo el UUID sin corchetes
$ vbm list vms | grep Fred | vmc
f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a
Lo que me gustaría hacer es establecer ese resultado en una variable. Lo que he estado haciendo es volver a ejecutar el comando, pero editarlo primero para agregar una instrucción de conjunto de variables al principio, como esto:
$ set vm='vbm list vms | grep Fred | vmc'
Entonces puedo reutilizar vm
en mis comandos fácilmente:
$ vbm control $vm poweroff
Me gusta tener la opción de no configurar la variable porque hay veces que no necesito usarla, simplemente verla. Puedo redirigirlo, pero eso va a un archivo. He intentado canalizarlo, pero eso requiere otro comando. ¿Alguien sabe cómo hacer esto?
Actualización (20/05/16):
Obtuve mucho más de esta pregunta de lo que esperaba, así que gracias a @ user3439894, @ fd0 y @Mateusz Szlosek por su excelente sugerencia.
Seleccioné la solución @ of user3439894 'de usar
vm='!!'
porque era simple y elegante. Lo asigné a una tecla de acceso directo para cuando lo necesitaba para un uso aún más fácil. Sin embargo, al leer las otras respuestas, ahora tengo otras soluciones que puedo usar para diferentes desafíos de scripting que he encontrado en el pasado.