Một cách tiếp cận khác là sử dụng wmctrl
tiện ích (điều khiển Window Manager). Điều này có thể được sử dụng để báo cho người quản lý cửa sổ giả vờ bạn nhấp vào nút đóng. Điều này tránh được bản chất có khả năng nặng tay killall
; ví dụ, một số chương trình có tài liệu chưa được lưu sẽ thoát ngay lập tức khi chúng bị giết (thậm chí nhẹ nhàng), trong khi nhấp vào nút đóng sẽ hiển thị "Bạn có muốn lưu không?" lời nhắc.
Lệnh cơ bản là wmctrl -c WINDOWTITLE
, vì vậy trong trường hợp này wmctrl -c "Archive Manager"
(giả sử nó không có tệp mở: thay đổi tiêu đề). Thật không may, nó chỉ đóng một lúc, vì vậy chúng ta cần phải làm nhiều hơn để đóng tất cả chúng.
wmctrl
trả về thành công nếu tìm thấy kết quả khớp, vì vậy chúng ta có thể lặp cho đến khi thất bại:
while wmctrl -c "Archive Manager"; do sleep 0.1; done
Điều này luôn chọn cửa sổ đầu tiên mà nó tìm thấy, vì vậy chúng ta cần ngủ một chút để tránh liên tục gửi một luồng lệnh đóng đến cửa sổ đầu tiên đang bận đóng - điều đó có thể gây ra lỗi dừng vòng lặp.
Điều này đơn giản và thường hoạt động, nhưng ngủ một khoảng thời gian nhất định và hy vọng cửa sổ đóng lại trước khi chúng tôi thử lại là một cách lộn xộn và chậm để tránh lỗi. Những gì chúng tôi thực sự muốn làm là gửi ngay một tin nhắn gần gũi đến mọi cửa sổ phù hợp.
Chúng tôi có thể tìm thấy tất cả các cửa sổ mở với wmctrl -l
. Điều này liệt kê một id cửa sổ số mà chúng ta có thể sử dụng để xác định từng cửa sổ riêng lẻ, ngay cả khi tất cả chúng có cùng tiêu đề. Sau đó, chúng ta cần lọc chỉ các cửa sổ phù hợp ( grep
lệnh), chỉ rút ra id cửa sổ ( cut
lệnh) và gọi wmctrl -i -c
cho từng cửa sổ . Các -i
là cần thiết để phù hợp với id cửa sổ thay vì tiêu đề cửa sổ.
for w in $(wmctrl -l | grep "Archive Manager" | cut -d" " -f1); do
wmctrl -i -c $w
done
Một chút phức tạp khi chỉ cần gõ bất cứ khi nào một con mèo bước trên bàn phím của bạn, nhưng hy vọng là một kỹ thuật tiện dụng để giữ trong hộp công cụ kịch bản của bạn.
kill cat
hành động tôi sẽ đề xuất.