Ich habe mehrere Bewerbungen offen. Ausführen von wmctrl und die Ausgabe an awk weiterleiten listet die Fenster-IDs (mit Ausnahme von „klebrigen“ Fenstern) wie folgt auf:
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Ich kann diese Ausgabe an wmctrl senden um alle diese Fenster zu schließen:
-
Fenster ohne Inhalt, die gespeichert werden müssen, und Fenster, die keine Antwort benötigen, werden geschlossen, ohne mich zu fragen, aber
-
Fenster wie die von Redakteuren mit nicht gespeicherten Inhalten oder Terminals, auf denen ein Prozess läuft, werden „ordentlich“ geschlossen:Die jeweilige Anwendung zeigt ein Fenster an, in dem ich Änderungen speichern oder verwerfen oder mich über einen noch laufenden Prozess informieren kann.
Das folgende Skript, das einem geeigneten Shortcut zugeordnet ist, funktioniert:
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
Ich fand das einfacher (für mich) for i in $list
geht auch.
Gibt es einen Grund, das eine dem anderen vorzuziehen?
„sticky“ und „gracefully“ sind Begriffe aus man wmctrl
.
Akzeptierte Antwort:
In Ihrem Skript $list
ist dasselbe wie ${list[@]}
.
Letzteres ist eine Array-Syntax, aber in Ihrem Skript ist es eine normale Variable.
Da Sie keine Leerzeichen in Ihrem wmctl
haben Ausgabeelemente benötigen Sie kein Array und verwenden Sie $list
ist vollkommen in Ordnung.
Wenn es war ein Array, $list
wäre nur das erste Element des Arrays (=> item1
) und ${list[@]}
würde sich auf alle Artikel erstrecken (=> item1 item2 item3
).
Aber was du wirklich wolltest, wenn es tatsächlich war ein Array ist "${list[@]}"
(mit Anführungszeichen), die bis zu "item1" "item2" "item3"
reicht , damit es nicht an Leerzeichen erstickt.
(Lesen)