Establezca el resultado del comando en variable en la ejecución posterior de Terminal

2

¿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.

    
pregunta Allan 18.05.2016 - 16:47

3 respuestas

2

Una forma es lograr lo que estás pidiendo es:

Después de haber ejecutado vbm list vms | grep Fred | vmc , y desea establecer de inmediato la salida de esa recomendación a una variable , simplemente escriba, por ejemplo:

vm='!!'

Luego presiona enter.

Para eliminar la variable $vm , use: unset vm

    
respondido por el user3439894 18.05.2016 - 19:16
2

¿Qué sucede si usaste una función definida en uno de tus archivos de inicio de bash?

getvmid () {
/Applications/VirtualBox.app/Contents/MacOS/VBoxManage list vms | grep $1 | cut -f 2 -d { | cut -f 1 -d }
}

El $1 es el primer parámetro de la función. También limita el alcance de la variable.

getvmid Fred

Configurando la variable:

vm=$(getvmid Fred)

No probado, pero esto también debería funcionar:

vbm control "$(getvmid Fred)" poweroff
    
respondido por el fd0 18.05.2016 - 18:54
1

Puede canalizar la salida de vmc a la herramienta de línea de comandos xargs .

Esto se verá así:

vbm list vms | grep Fred | vmc | xargs -I {} vbm control {} poweroff

Evitarás asignar la salida a la variable.

    
respondido por el Mateusz Szlosek 18.05.2016 - 19:25

Lea otras preguntas en las etiquetas