如何从 shell 关闭特定的 X11 窗口?

如何从 shell 关闭特定的 X11 窗口?

如何从命令行关闭特定窗口而不终止其控制应用程序?

基于示例的问题使其更清楚:

我最近有一个应用程序运行混乱,打开了许多firefox窗口。我需要关闭它们,但不终止firefox(因为这只会通过firefox的会话恢复来恢复窗口)。如何从 shell 中“直接关闭”窗口,比如点击关闭按钮?

答案1

简单尝试

wmctrl -c firefox

wmctrl手册页:与 EWMH/NetWM 兼容的 X 窗口管理器交互。

  • 你可以对-F选项更加严格:

    -F窗口名称参数 ( <WIN>) 将被视为区分大小写的精确窗口标题。如果没有此选项,窗口标题将被视为完整窗口标题的不区分大小写的子字符串。

  • 要关闭特定窗口,您可以使用 列出它们wmctrl -l,然后使用 将其关闭wmctrl -ic ID

不确定 Wayland 上的方法是什么。

也回答过这里

答案2

的组合xlswxdotool成功了。

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。

相关内容