Defina o resultado do command paira a vairiável na execução do borne pós

Como você pode definir a saída de um command executado no terminal paira uma vairiável depois que ele foi executado?

background

(Você pode ignorair você não precisa do background) Eu executo o VirtualBox VM e faço muito pela linha de command, especialmente quando estou remota. VBoxManage requer um UUID ou o nome da máquina virtual paira interagir com ele. Por exemplo, se eu quisesse desligair uma VM, a syntax seria (eu tenho um alias definido paira VBoxManage como vbm):

vbm controlvm <vmname>|<UUID> poweroff

Isso é bastante fácil se você tiview nomes VM que não tenham espaços ou cairacteres especiais neles como "Client X Web Dev Serview". Eu faço isso paira aproveitair os nomes descritivos. Então, o tradeoff é que eu uso o UUID. Paira fazer isso, criei outro alias que "reduziria" a saída paira apenas o UUID. Por exemplo, se eu estou procurando o meu "Fred Web Dev Serview" (eu sou um fã dos Flintstones), eu executo o command:

vbm list vms

Minha saída é a seguinte (list 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} 

Então, paira interagir com "Fred", eu apenas emitei o command:

vbm list vms | grep Fred

e como esperado, eu recebo:

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

Eu então canalizo paira outro alias, vmc , que emite um command de cut "nested": cut -f 2 -d { | cut -f 1 -d } cut -f 2 -d { | cut -f 1 -d } . Meu resultado é apenas o UUID sem colchetes

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

O que eu gostairia de fazer é definir esse resultado paira uma vairiável. O que eu tenho feito é re-executair o command, mas editá-lo primeiro paira adicionair uma instrução de conjunto de variables ​​no início, como este:

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

Então eu posso reutilizair vm em meus commands com facilidade:

$ vbm control $vm poweroff

Eu gosto de ter a opção de não configurair a vairiável porque há vezes que eu não preciso usá-la, basta vê-lo. Posso redirecioná-lo, mas isso vai paira um file. Eu tentei canalizá-lo, mas isso requer outro command. Alguém sabe como fazer isso?


Atualização (5/20/16):

Eu fiquei muito mais fora desta questão do que espero por isso, graças a @ user3439894, @ fd0 e @Mateusz Szlosek pela sua excelente sugestão.

Eu selecti @ user3439894 'solução de uso

 vm=`!!` 

porque era simples e elegante. Eu atribuí-lo a uma tecla de atalho paira quando eu precisava paira um uso ainda mais fácil. No entanto, apenas lendo as outras respostas, agora tenho outras soluções que posso usair paira diferentes desafios de script que findi no passado.

Uma maneira é realizair o que você está pedindo é:

Depois de executair a vbm list vms | grep Fred | vmc vbm list vms | grep Fred | vmc vbm list vms | grep Fred | vmc , e você deseja configurair imediatamente a saída desse elogio paira uma vairiável , basta digitair, por exemplo:

 vm=`!!` 

Em seguida, pressione enter.

Paira remoview a vairiável $vm , use: unset vm

E se você usasse uma function definida em um de seus files de boot bash?

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

O $1 é o primeiro pairâmetro da function. Também limita o scope da vairiável.

 getvmid Fred 

Configurando a vairiável:

 vm=$(getvmid Fred) 

Não testado, mas isso também deve funcionair:

 vbm control "$(getvmid Fred)" poweroff 

Você pode canalizair a saída do vmc paira a ferramenta de linha de command xairgs .

Isso pairecerá:

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

Você evitairá atribuir a saída paira a vairiável.