Imposta il risultato del comando sulla variabile in Terminale post esecuzione

2

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.

    
posta Allan 18.05.2016 - 16:47
fonte

3 risposte

2

Un modo è quello di ottenere ciò che stai chiedendo:

Dopo aver eseguito vbm list vms | grep Fred | vmc e vuoi impostare immediatamente l'output di quel comando su una variabile , digita semplicemente, ad esempio:

vm='!!'

Quindi premere invio.

Per rimuovere la $vm variabile , utilizza: unset vm

    
risposta data 18.05.2016 - 19:16
fonte
2

Che cosa succede se hai usato una funzione definita in uno dei tuoi file di avvio bash?

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

Il $1 è il primo parametro della funzione. Limita anche l'ambito della variabile.

getvmid Fred

Impostazione della variabile:

vm=$(getvmid Fred)

Non testato, ma dovrebbe funzionare anche:

vbm control "$(getvmid Fred)" poweroff
    
risposta data 18.05.2016 - 18:54
fonte
1

Puoi reindirizzare l'output da vmc allo strumento da riga di comando xargs .

Sembrerà:

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

Eviterai di assegnare l'output alla variabile.

    
risposta data 18.05.2016 - 19:25
fonte

Leggi altre domande sui tag