J'ai plusieurs applications ouvertes. Exécution de wmctrl et diriger la sortie vers awk répertorie les identifiants de fenêtre (à l'exclusion des fenêtres "collantes") comme ceci :
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Je peux envoyer cette sortie à wmctrl pour fermer toutes ces fenêtres :
-
les fenêtres sans contenu qui doivent être sauvegardées et les fenêtres qui n'ont pas besoin de réponse seront fermées sans me demander mais
-
les fenêtres telles que celles des éditeurs dont le contenu n'est pas enregistré ou les terminaux exécutant un processus seront fermées « gracieusement » :l'application respective présentera une fenêtre me permettant d'enregistrer les modifications ou d'annuler les modifications ou de m'informer d'un processus qui est toujours en cours d'exécution.
Le script suivant, associé à un raccourci approprié, fonctionne :
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
J'ai trouvé que le plus simple (pour moi) for i in $list
fonctionne également.
Y a-t-il une raison de préférer l'un à l'autre ?
"collant" et "gracieusement" sont des termes de man wmctrl
.
Réponse acceptée :
Dans votre script $list
est identique à ${list[@]}
.
Cette dernière est une syntaxe de tableau, mais dans votre script, il s'agit d'une variable normale.
Comme vous n'avez pas d'espace dans votre wmctl
éléments de sortie, vous n'avez pas besoin d'un tableau et utilisez $list
est parfaitement bien.
Si c'était l'était un tableau, $list
ne serait que le premier élément du tableau (=> item1
) et ${list[@]}
s'étendrait à tous les articles (=> item1 item2 item3
).
Mais ce que vous vouliez vraiment si c'était en fait l'était un tableau est "${list[@]}"
(avec guillemets) qui s'étend jusqu'à "item1" "item2" "item3"
, afin qu'il ne s'étouffe pas avec les espaces.
(Lire)