Ho diverse applicazioni aperte. Esecuzione di wmctrl e pipettando l'output su awk elenca gli ID delle finestre (escluse le finestre "sticky") in questo modo:
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Posso inviare questo output a wmctrl per chiudere tutte queste finestre:
-
le finestre senza contenuto che deve essere salvato e le finestre che non necessitano di una risposta verranno chiuse senza chiedermelo ma
-
finestre come quelle degli editor con contenuto non salvato o terminali che eseguono un processo verranno chiuse "con grazia":la rispettiva applicazione presenterà una finestra che mi consentirà di salvare le modifiche o scartare le modifiche o di informarmi di un processo ancora in esecuzione.
Il seguente script, assegnato a una scorciatoia adatta, funziona:
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
Ho scoperto che il più semplice (per me) for i in $list
funziona anche.
C'è qualche motivo per preferire l'uno all'altro?
"sticky" e "gracefully" sono termini di man wmctrl
.
Risposta accettata:
Nel tuo script $list
è uguale a ${list[@]}
.
Quest'ultima è la sintassi dell'array, ma nel tuo script è una variabile normale.
Poiché non hai spazi bianchi nel tuo wmctl
elementi di output, non è necessario un array e utilizzando $list
va benissimo.
Se era un array, $list
sarebbe solo il primo elemento dell'array (=> item1
) e ${list[@]}
si estenderebbe a tutti gli articoli (=> item1 item2 item3
).
Ma cosa volevi davvero se effettivamente era un array è "${list[@]}"
(tra virgolette) che si estende a "item1" "item2" "item3"
, quindi non si strozzerebbe sugli spazi bianchi.
(Leggi)