我有一个bash脚本,我想在其中向用户显示图像。使用ImageMagick的display可以做到这一点。

display image.png

但是现在终端窗口的焦点丢失了,并被放置到图像上。要继续我的bash脚本,我必须要求用户在继续之前单击终端。这是不想要的行为。

有没有一种方法可以显示图像而不丢失bash终端的焦点?我希望它能在Ubuntu Linux(12.04)上运行。

最佳答案

这是使用wmctrl的一个不太尴尬的解决方案:

wmctrl -T master$$ -r :ACTIVE: ; display image.png & sleep 0.1 ; wmctrl -a master$$

为了说明,我将其分解为以下步骤:
  • wmctrl -T master$$ -r :ACTIVE:
    要控制窗口,wmctrl需要知道其名称,默认情况下,其名称是其窗口标题。因此,此步骤将当前窗口分配给唯一名称master$$, shell 程序将在其中将$$扩展为进程ID号。您可能需要选择其他名称。
  • display image.png &
    此步骤将您的图像显示为“背景”过程。图像窗口将捕获焦点。
  • sleep 0.1

    我们需要等待足够的时间,以便display打开其窗口。
  • wmctrl -a master$$
    现在,我们将焦点从display撤回。如果在步骤1中为主窗口选择了其他名称,请在此处使用该名称代替master$$

  • 如果您的系统上未安装wmctrl,则需要安装它。在类似debian的系统上,运行:
    apt-get install wmctrl
    
    wmctrl支持Enlightenment,icewm,kwin,metacity,sawfish和所有其他EWMH/NetWM兼容的X窗口管理器。

    不需要知道窗口标题的替代方法

    首先,获取当前窗口的ID:
    my_id=$(wmctrl -l -p | awk -v pid=$PPID '$3 == pid {print $1}')
    

    现在,我们可以使用该ID代替窗口标题。要在保持当前窗口焦点的同时启动display:
    display image.png & sleep 0.1 ; wmctrl -i -a "$my_id"
    

    08-28 21:02