¿Cómo se puede establecer la salida de un comando ejecutado en el terminal a una variable después de que se haya ejecutado?
Antecedentes
(Puedes omitirlo si no necesitas el fondo). Ejecuto VirtualBox VM y hago muchas cosas desde la línea de comandos, especialmente cuando estoy en remoto. VBoxManage
requiere un UUID o el nombre de la máquina virtual para poder interactuar con ella. Por ejemplo, si quisiera apagar una VM, la sintaxis sería (tengo un alias establecido para VBoxManage como vbm):
vbm controlvm <vmname>|<UUID> poweroff
Esto es bastante fácil si tienes nombres de VM que no tienen espacios o caracteres especiales en ellos como "Cliente X Servidor de Desarrollo Web". Yo hago esto para poder aprovechar los nombres descriptivos. Entonces, la contrapartida es que uso el UUID. Para hacer esto, he creado otro alias que `cortará' la salida a sólo el UUID. Por ejemplo, si estoy buscando mi "Fred Web Dev Server" (soy un fan de los Picapiedra), ejecuto el comando:
vbm list vms
Mi resultado es el 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}
Así que, para interactuar con "Fred", simplemente emito el comando
vbm list vms | grep Fred
y como era de esperar, obtengo:
"Fred - FreeBSD 10.2" {f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a}
Luego lo canalizo a otro alias, vmc
que emite un cut
comando: cut -f 2 -d { | cut -f 1 -d }
. Mi resultado es sólo el UUID sin paréntesis
$ 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 reejecutar el comando, pero editándolo primero para añadir una instrucción de conjunto de variables al principio así:
$ 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 fijar la variable porque hay veces que no necesito usarla, sólo verla. Puedo redirigirla, pero eso va a un archivo. He intentado canalizarla, pero eso requiere otro comando. ¿Alguien sabe cómo hacerlo?
Actualización (5/20/16):
He sacado mucho más partido a esta pregunta de lo que esperaba, así que gracias a @user3439894, @fd0 y @Mateusz Szlosek por su excelente sugerencia.
He elegido la solución de @user3439894 de utilizar
vm=`!!`
porque era simple y elegante. Lo asigné a una tecla de acceso directo para cuando lo necesitara para facilitar aún más su uso. Sin embargo, al leer las otras respuestas, ahora tengo algunas otras soluciones que puedo utilizar para diferentes desafíos de scripting que he encontrado en el pasado.