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. VBoxManage
requiert 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, vmc
qui émet un « imbriquée » cut
commande: 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 vm
facilement 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é.
la source
vbm list vms | grep Fred | vmc
et 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$vm
variable, utilisez:unset vm
Réponses:
Une façon d'accomplir ce que vous demandez est:
Une fois que vous avez exécuté
vbm list vms | grep Fred | vmc
et que vous voulez définir immédiatement la sortie de cette recommandation en variable , tapez simplement, par exemple:Puis appuyez sur Entrée.
Pour supprimer la
$vm
variable , utilisez:unset vm
la source
Et si vous utilisiez une fonction définie dans l'un de vos fichiers de démarrage bash?
Le
$1
est le premier paramètre de la fonction. Cela limite également la portée de la variable.Réglage de la variable:
Non testé mais cela devrait également fonctionner:
la source
Vous pouvez diriger la sortie de
vmc
vers l'xargs
outil de ligne de commande.Cela ressemblera à:
Vous éviterez d'assigner la sortie à la variable.
la source
vbm modify $vm --vrde on
ou similaire ....