Tengo varias aplicaciones abiertas. Ejecutando wmctrl y canalizando la salida a awk enumera los ID de las ventanas (excluyendo las ventanas "adherentes") de esta manera:
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Puedo enviar esta salida a wmctrl para cerrar todas estas ventanas:
-
las ventanas sin contenido que deba guardarse y las ventanas que no necesiten una respuesta se cerrarán sin preguntarme, pero
-
las ventanas como las de los editores con contenido no guardado o terminales que ejecutan un proceso se cerrarán "graciosamente":la aplicación respectiva presentará una ventana que me permitirá guardar cambios o descartar cambios o informarme de un proceso que aún se está ejecutando.
El siguiente script, asignado a un atajo adecuado, funciona:
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
Encontré que el más simple (para mí) for i in $list
también funciona.
¿Hay alguna razón para preferir uno sobre el otro?
"pegajoso" y "con gracia" son términos de man wmctrl
.
Respuesta aceptada:
En tu script $list
es lo mismo que ${list[@]}
.
Esta última es sintaxis de matriz, pero en su secuencia de comandos es una variable normal.
Como no tiene espacios en blanco en su wmctl
elementos de salida, no necesita una matriz y usa $list
está perfectamente bien.
Si fuera una matriz, $list
solo sería el primer elemento de la matriz (=> item1
) y ${list[@]}
se extendería a todos los artículos (=> item1 item2 item3
).
Pero lo que realmente querías si en realidad era una matriz es "${list[@]}"
(con comillas) que se extiende a "item1" "item2" "item3"
, por lo que no se atragantaría con los espacios en blanco.
(Leer)