如何从命令行关闭特定窗口而不终止其控制应用程序?
基于示例的问题使其更清楚:
我最近有一个应用程序运行混乱,打开了许多firefox
窗口。我需要关闭它们,但不终止firefox
(因为这只会通过firefox
的会话恢复来恢复窗口)。如何从 shell 中“直接关闭”窗口,比如点击关闭按钮?
答案1
答案2
xlsw
按标题和类型列出窗口,xdotool
并对其执行操作。原则上,xdotool
也可以搜索窗口的名称,但它错过了弹出窗口。
在bash
:
xlsw | grep 'Firefox/Popup' | awk '{print $1}' | \
while read _windowID; do xdotool windowclose "${_windowID}"; done
解释:
xlsw
输出窗口 ID 列表以及其他信息。输出如下:
[...]
0x04800001 u-- Pale moon/pale moon Pale Moon
0x04800092 uio NA Pale Moon
0x04800093 u-o Pale moon/palemoon Pale Moon
0x04800099 u-o Pale moon/palemoon Pale Moon
0x04828D21 u-o Pale moon/Popup Pale Moon
0x0489C5D6 u-o Pale moon/Popup Pale Moon
0x03600001 ui- NA NA
0x04604E77 --o Claws-mail/claws-mail claws-mail
0x04604EAC --o Claws-mail/claws-mail claws-mail
0x04604F22 --o Claws-mail/claws-mail claws-mail
0x05C00001 uio NA NA
0x05E00001 u-- NA NA
0x05200007 ui- NA NA
0x05E00002 u-- Wine/explorer.exe
[...]
然后,使用 -command grep
,将选择弹出窗口firefox
(在上面的例子中,它们已经全部消失了)。awk
打印第一个条目,即窗口 ID,然后xdotool windowclose
关闭窗口(喜欢点击关闭按钮)而不终止其控制应用程序。 (xdotool windowkill
将会终止该应用程序。)
xdotool
还具有内置搜索:xdotool search 'firefox' windowclose
也会关闭标题中带有“firefox”的所有窗口,但我无法让它区分“弹出窗口”。
答案3
我注意到您的个人资料显示您是 Ask Ubuntu 的用户,因此我将分享我在 Ubuntu 上从 shell 选择并关闭打开的窗口的方法。同样的方法也适用于许多其他 Linux 发行版。
wmctrl -mlpx
列出打开的窗口及其窗口 ID 和每个窗口的描述。对于 Firefox,描述是具有焦点的选项卡的标题,弹出窗口作为单独的窗口列出。wmctrl -ic <window-id>
window-id
从终端关闭具有 id= 的窗口。
如果您尚未安装 wmctrl,则可以sudo apt install wmctrl
在当前支持的所有 Ubuntu 版本中安装它,而无需安装任何其他来自 GitHub 的软件。Fedora 软件包数据库中还有一个 wmctrl 的 .rpm。