环境变量XDG_VTNR是什么?

环境变量XDG_VTNR是什么?

我发现的几乎每个页面都会在登录后自动启动 Xorg,无需解释,例如~/.bash_profile

if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
  exec xinit
fi

我想$XDG_VTNR可能是一个用于获取当前 TTY 号码的变量,但是,已经有一个名为 的命令tty,它可以满足相同的目的。

我的问题:

  1. 什么是$XDG_VTNR?何时何地设置?
  2. 在哪里可以找到有关此变量的官方文档?
  3. tty是一个内置命令,而它$XDG_VTNR是由 Xorg 提供的,为什么人们选择使用$XDG_VTNR而不是内置命令tty

答案1

什么是$XDG_VTNR?何时何地设置?

它由 PAM 模块设置pam_systemd,并且仅在使用 systemd 的计算机上设置,这意味着您应该不是在你的脚本中依赖它,除非你想让它们依赖于 systemd。

在使用 systemd 的系统上,将在图形模式(通过、等)和文本模式会话(通过 )中$XDG_VTNR进行设置。lightdmgdm/bin/login

在哪里可以找到有关此变量的官方文档?

在里面pam_systemd(8)联机帮助页。

tty是一个内置命令,而它$XDG_VTNR是由 Xorg 提供的,为什么人们选择使用$XDG_VTNR而不是内置命令tty

1)tty是一个独立程序,不是内置程序,并且$XDG_VTNR不是由 Xorg 提供的。

2)因为它们是完全不同的东西。正如其手册页中明确指出的那样,tty(1)将告诉您连接到其标准输入的终端的名称,而不是您的 GUI 会话或可能正在运行的虚拟终端的名称[1]。考虑一下:

$ script -q /dev/null
$ tty
/dev/pts/5
$ script -q /dev/null
$ tty
/dev/pts/6
$ tty </dev/zero
not a tty

[1] 这XDG_VTNR也不是一个可靠的指标。

答案2

XDG_VTNR是一个记录较少的环境变量。 Systemd 使用/设置它。请参阅systemd.execpam_systemd手册页。一些显示管理器也使用/设置它。一些 X11 启动脚本使用/设置它。

systemd/pam_systemd.c

if (vtnr > 0) {
            char buf[DECIMAL_STR_MAX(vtnr)];
            sprintf(buf, "%u", vtnr);

            r = update_environment(handle, "XDG_VTNR", buf);
            if (r != PAM_SUCCESS)
                    return r;
} 

您可以在虚拟终端 (VT) 中启动 X11 会话,而不仅仅是在控制台中。该XDG_VTNR变量指定 VT 编号。

额外的DISPLAY测试是必要的,因为代码片段可以在图形和非图形登录上执行。由于XDG_VTNR将在 X11 会话内启动的 shell(例如终端)中设置为相同的值,因此有必要阻止它们尝试启动 X11。

exec命令用 X11 会话替换登录 shell。这意味着当 X11 会话终止时,您将被注销。

相关内容