2 votos

Establecer el resultado del comando a la variable en el Terminal después de la ejecución

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

3voto

user3439894 Puntos 5883

Una forma es lograr lo que pides es:

Después de haber ejecutado vbm list vms | grep Fred | vmc y quieres poner inmediatamente la salida de ese commend en un variable , sólo tienes que escribir, por ejemplo:

vm=`!!`

A continuación, pulse Intro.

Para eliminar el $vm variable usar: unset vm

2voto

Michael Zhou Puntos 167

¿Y si utilizas 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

Fijación de la variable:

vm=$(getvmid Fred)

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

vbm control "$(getvmid Fred)" poweroff

1voto

hjdm Puntos 18

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

Esto se verá así:

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

Evitarás asignar la salida a la variable.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X