Mám otevřených několik aplikací. Spuštění wmctrl a nasměrování výstupu do awk uvádí ID oken (kromě „slepých“ oken) takto:
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Mohu poslat tento výstup do wmctrl zavřete všechna tato okna:
-
okna bez obsahu, který je třeba uložit, a okna, která nevyžadují odpověď, se zavřou bez dotazu, ale
-
okna, jako jsou okna editorů s neuloženým obsahem nebo terminály se spuštěným procesem, budou „slušně“ uzavřeny:příslušná aplikace zobrazí okno, které mi umožní uložit změny nebo změny zahodit nebo mě informovat o procesu, který stále běží.
Funguje následující skript přiřazený vhodné zkratce:
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
Zjistil jsem, že jednodušší (pro mě) for i in $list
také funguje.
Existuje nějaký důvod upřednostňovat jedno před druhým?
„sticky“ a „ladně“ jsou výrazy z man wmctrl
.
Přijatá odpověď:
Ve vašem skriptu $list
je stejný jako ${list[@]}
.
To je syntaxe pole, ale ve vašem skriptu je to normální proměnná.
Protože ve vašem wmctl
nemáte žádné mezery výstupní položky, nepotřebujete pole a pomocí $list
je naprosto v pořádku.
Pokud bylo pole, $list
by byla pouze první položkou pole (=> item1
) a ${list[@]}
by se rozšířil na všechny položky (=> item1 item2 item3
).
Ale co jste opravdu chtěli, pokud to ve skutečnosti bylo pole je "${list[@]}"
(s uvozovkami), které sahá až do "item1" "item2" "item3"
, takže by se nedusila mezerami.
(Přečíst)