Définir le résultat de la commande sur variable dans la post-exécution du terminal


2

Comment définir la sortie d'une commande exécutée dans terminal sur une variable après son exécution?


Contexte

(Vous pouvez ignorer si vous n'avez pas besoin de l'arrière-plan). J'exécute VirtualBox VM et j'en fais beaucoup à partir de la ligne de commande, en particulier lorsque je suis à distance. VBoxManagerequiert un UUID ou le nom de la machine virtuelle pour pouvoir interagir avec elle. Par exemple, si je voulais mettre une machine virtuelle hors tension, la syntaxe serait la suivante (j'ai un alias défini pour VBoxManage en tant que vbm):

vbm controlvm <vmname>|<UUID> poweroff

C'est assez facile si vous avez des noms de machine virtuelle qui ne contiennent ni espaces ni caractères spéciaux, comme "Client X Web Dev Server". Je fais cela pour pouvoir tirer parti des noms descriptifs. Donc, le compromis est que j'utilise l'UUID. Pour ce faire, j'ai créé un autre alias qui «réduira» la sortie uniquement en UUID. Par exemple, si je recherche mon "Serveur Fred Web Dev" (je suis un fan des Flintstones), j'exécute la commande:

vbm list vms

Ma sortie est la suivante (liste abrégée):

"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}

Donc, pour interagir avec "Fred", je viens d’émettre la commande:

vbm list vms | grep Fred

et comme prévu, je reçois:

"Fred - FreeBSD 10.2" {f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a}

Je puis conduit à un autre alias, vmcqui émet un « imbriquée » cutcommande: cut -f 2 -d { | cut -f 1 -d }. Mon résultat est juste le UUID sans parenthèses

$ vbm list vms | grep Fred | vmc
f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a

Ce que je voudrais faire est de définir ce résultat à une variable. Ce que je fais est de ré-exécuter la commande, mais en la modifiant d'abord pour ajouter une instruction de jeu variable au début comme ceci:

$ set vm=`vbm list vms | grep Fred | vmc`

Ensuite, je peux vmfacilement réutiliser mes commandes:

$ vbm control $vm poweroff

J'aime avoir la possibilité de ne pas définir la variable car, parfois, je n'ai pas besoin de l'utiliser, il suffit de la voir. Je peux le rediriger, mais cela va dans un fichier. J'ai essayé de le diriger, mais cela nécessite une autre commande. Est-ce que quelqu'un sait comment faire ça?


Mise à jour (20/05/16):

J'ai eu beaucoup plus de cette question que je ne le pensais. Merci donc à @ user3439894, @ fd0 et @Mateusz Szlosek pour leur excellente suggestion.

J'ai sélectionné la solution @ user3439894 'd'utilisation

vm=`!!` 

parce que c'était simple et élégant. Je l'ai assigné à une touche de raccourci pour quand j'en avais besoin pour une utilisation encore plus facile. Cependant, à la lecture des autres réponses, j’ai maintenant quelques autres solutions que je peux utiliser pour différents défis de script que j’ai rencontrés dans le passé.


2
Une fois que vous avez exécuté vbm list vms | grep Fred | vmcet que vous souhaitez définir immédiatement la sortie de cette recommandation sur une variable, il vous suffit de taper, par exemple, vm=`!!`et d'appuyer sur Entrée. Pour supprimer la $vmvariable, utilisez:unset vm
user3439894

@ user3439894 Vous devriez ajouter cela comme réponse afin que je puisse faire un vote positif.
Allan

Réponses:


2

Une façon d'accomplir ce que vous demandez est:

Une fois que vous avez exécuté vbm list vms | grep Fred | vmcet que vous voulez définir immédiatement la sortie de cette recommandation en variable , tapez simplement, par exemple:

vm=`!!`

Puis appuyez sur Entrée.

Pour supprimer la $vm variable , utilisez:unset vm


2

Et si vous utilisiez une fonction définie dans l'un de vos fichiers de démarrage bash?

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

Le $1est le premier paramètre de la fonction. Cela limite également la portée de la variable.

getvmid Fred

Réglage de la variable:

vm=$(getvmid Fred)

Non testé mais cela devrait également fonctionner:

vbm control "$(getvmid Fred)" poweroff

J'aime ça. Je ne me suis jamais rendu compte que je pouvais mettre des fonctions dans mon fichier de démarrage bash. Je vais devoir rechercher cela plus.
Allan

1

Vous pouvez diriger la sortie de vmcvers l' xargsoutil de ligne de commande.

Cela ressemblera à:

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

Vous éviterez d'assigner la sortie à la variable.


C'est une bonne suggestion, mais je souhaite généralement réutiliser le même uuid pour la prochaine série de commandes, similaire vbm modify $vm --vrde onou similaire ....
Allan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.