GNOME_TERMINAL_SCREEN 环境变量是什么?

问题描述 投票:0回答:2

我最近在我的一台计算机上安装了 Ubuntu 20.4 LTS。此版本的 Ubuntu 默认使用 gnome 桌面管理器 (3.36.3) 和 gnome-terminal (3.36.2)。

在我打开的每个终端窗口中,GNOME_TERMINAL_SCREEN 环境变量被定义为“/org/gnome/Terminal/screen/some-guid”,其中每个终端窗口的 GUID 都是唯一的。

有谁知道这个变量的用途是什么?有没有办法使用Xlib或XCB中的GUID来识别终端的X窗口?

gnome gnome-terminal
2个回答
1
投票

$GNOME_TERMINAL_SCREEN
环境变量包含 D-Bus 的对象路径。
它用于在 Gnome 终端中启动进程时寻址 Gnome 终端中的选项卡,并发出其终止信号。

运行以下命令即可看到其D-Bus接口的相关部分:

dbus-send --session --type=method_call --print-reply \
        --dest=org.gnome.Terminal "$GNOME_TERMINAL_SCREEN" \
        org.freedesktop.DBus.Introspectable.Introspect

输出(为了相关性而进行剪裁):

[...]
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
    "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.64.6 -->
<node>
  [...]
  <interface name="org.gnome.Terminal.Terminal0">
    <method name="Exec">
      <arg type="a{sv}" name="options" direction="in"/>
      <arg type="aay" name="arguments" direction="in"/>
    </method>
    <signal name="ChildExited">
      <arg type="i" name="exit_code"/>
    </signal>
  </interface>
</node>

如果运行

dbus-monitor
并打开和关闭 Gnome 终端选项卡,您可以看到正在运行的 D-Bus 通信。

X Window 系统不知道 D-Bus 领域中发生了什么,据我所知,Gnome 终端不会通过 D-Bus 公开任何 X 特定信息。

我找到了一种将进程绑定到运行该进程的 Gnome 终端的 X 窗口的方法,但它不太理想。尽管如此,它可能足以满足您的目的。
这个想法是,当打开 Gnome 终端窗口时,我们将生成一个标识值,并将其存储在 Gnome 终端窗口的 X 属性和环境变量中。 然后,我们可以稍后从进程的环境中获取环境变量(如果需要,可以通过

/proc/<pid>/environ
),并扫描窗口以查找 X 属性中具有我们的值的变量。

由于打开新的 Gnome 终端时窗口还不存在,我们无法自己设置属性,但是

gnome-terminal
命令接受选项
--role
,并将其值存储在 Gnome 的
WM_WINDOW_ROLE
X 属性中终端窗口。
WM_WINDOW_ROLE
 X 属性
目的是唯一标识属于同一客户端的窗口。 如果没有
--role
,Gnome 终端会为其分配一个唯一的值,但您可以自己执行此操作。

所以这是一个

start-gnome-terminal
包装器,您可以从通常启动的键绑定中调用它
gnome-terminal
:

#!/bin/sh
FINDWIN_ROLE=findwin-role-$(xxd -p -l 16 < /dev/urandom)
export FINDWIN_ROLE
exec gnome-terminal --role "$FINDWIN_ROLE" "$@"

稍后要通过窗口查看该属性,您可以使用

wmctrl -l
xprop


0
投票

如果您执行命令

gnome-terminal --tab
打开新选项卡(注意:如果这是您的默认选项而不是打开新窗口,则不需要
--tab
),并且如果您从已运行的 gnome 终端执行此命令,然后新选项卡将出现在同一窗口中。

由于一次可以打开多个 gnome 终端窗口,因此必须有一种方法来知道要求从哪个终端打开新窗口。这是通过此环境变量完成的。

我不确定现在还有其他用途。将来它可以用于例如更改选项卡配置文件的命令行解决方案,恕我直言,这将非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.