Saya memiliki beberapa aplikasi yang terbuka. Menjalankan wmctrl dan menyalurkan output ke awk mencantumkan ID jendela (tidak termasuk jendela "lengket") seperti ini:
$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$
Saya dapat mengirim output ini ke wmctrl untuk menutup semua jendela ini:
-
windows tanpa konten yang perlu disimpan dan windows yang tidak memerlukan respons akan ditutup tanpa meminta saya tetapi
-
jendela seperti editor dengan konten yang belum disimpan atau terminal yang menjalankan proses akan ditutup "dengan anggun":aplikasi masing-masing akan menampilkan jendela yang memungkinkan saya untuk menyimpan perubahan atau membuang perubahan atau memberi tahu saya tentang proses yang masih berjalan.
Skrip berikut, ditetapkan ke pintasan yang sesuai, berfungsi:
#!/bin/bash
list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')
for i in ${list[@]}
do
wmctrl -i -a $i
wmctrl -i -c $i
done
Saya menemukan bahwa yang lebih sederhana (bagi saya) for i in $list
juga berfungsi.
Apakah ada alasan untuk memilih salah satu dari yang lain?
"lengket" dan "dengan anggun" adalah istilah dari man wmctrl
.
Jawaban yang Diterima:
Dalam skrip Anda $list
sama dengan ${list[@]}
.
Yang terakhir adalah sintaks array, tetapi dalam skrip Anda itu adalah variabel normal.
Karena Anda tidak memiliki spasi di wmctl
. Anda item keluaran, Anda tidak memerlukan array, dan menggunakan $list
baik-baik saja.
Jika adalah sebuah larik, $list
hanya akan menjadi item pertama dari array (=> item1
) dan ${list[@]}
akan diperluas ke semua item (=> item1 item2 item3
).
Tapi apa yang sebenarnya Anda inginkan jika itu benar-benar adalah array adalah "${list[@]}"
(dengan tanda kutip) hingga "item1" "item2" "item3"
, sehingga tidak akan tersedak spasi.
(Baca)