Come puoi impostare l'output di un comando eseguito nel terminale su una variabile dopo che è stato eseguito?
Sfondo
(Puoi saltare che non hai bisogno dello sfondo) Eseguo VirtualBox VM e faccio molto dalla riga di comando, specialmente quando sono remoto. VBoxManage
richiede un UUID o il nome della macchina virtuale per interagire con esso. Ad esempio, se volessi spegnere una VM, la sintassi sarebbe (ho un alias impostato per VBoxManage come vbm):
vbm controlvm <vmname>|<UUID> poweroff
Questo è piuttosto facile se hai nomi VM che non hanno spazi o caratteri speciali come "Client X Web Dev Server". Lo faccio in modo da poter sfruttare i nomi descrittivi. Quindi, il compromesso è che io uso l'UUID. Per fare ciò, ho creato un altro alias che ridurrà l'output al solo UUID. Ad esempio, se sto cercando il mio "server Web Dev Fred" (sono un fan dei Flintstones), eseguo il comando:
vbm list vms
Il mio output è il seguente (elenco abbreviato):
"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}
Quindi, per interagire con "Fred", ho appena impartito il comando:
vbm list vms | grep Fred
e come previsto, ottengo:
"Fred - FreeBSD 10.2" {f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a}
Quindi lo reindirizzo a un altro alias, vmc
, che emette un comando "nested" cut
: cut -f 2 -d { | cut -f 1 -d }
. Il mio risultato è solo l'UUID senza parentesi
$ vbm list vms | grep Fred | vmc
f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a
Quello che mi piacerebbe fare è impostare quel risultato su una variabile. Quello che ho fatto è rieseguire il comando, ma modificarlo prima per aggiungere all'inizio una istruzione set variabile come in questo modo:
$ set vm='vbm list vms | grep Fred | vmc'
Quindi posso riutilizzare facilmente vm
nei miei comandi:
$ vbm control $vm poweroff
Mi piace avere l'opzione di non impostare la variabile perché ci sono volte in cui non ho bisogno di usarlo, basta vederlo. Posso reindirizzare, ma quello va a un file. Ho provato a collegarlo, ma questo richiede un altro comando. Qualcuno sa come fare questo?
Aggiornamento (20/5/16):
Ho ottenuto molto di più da questa domanda di quanto mi aspetti, grazie a @ user3439894, @ fd0 e @Mateusz Szlosek per il loro eccellente suggerimento.
Ho selezionato @ user3439894 'la soluzione per l'utilizzo di
vm='!!'
perché era semplice ed elegante. L'ho assegnato a un tasto di scelta rapida per quando ne avevo bisogno per un utilizzo ancora più semplice. Tuttavia, leggendo solo le altre risposte, ora ho altre soluzioni che posso utilizzare per diverse sfide di scripting che ho incontrato nel passato.