我发现的几乎每个页面都会在登录后自动启动 Xorg,无需解释,例如~/.bash_profile
:
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
exec xinit
fi
我想$XDG_VTNR
可能是一个用于获取当前 TTY 号码的变量,但是,已经有一个名为 的命令tty
,它可以满足相同的目的。
我的问题:
- 什么是
$XDG_VTNR
?何时何地设置? - 在哪里可以找到有关此变量的官方文档?
tty
是一个内置命令,而它$XDG_VTNR
是由 Xorg 提供的,为什么人们选择使用$XDG_VTNR
而不是内置命令tty
?
答案1
什么是
$XDG_VTNR
?何时何地设置?
它由 PAM 模块设置pam_systemd
,并且仅在使用 systemd 的计算机上设置,这意味着您应该不是在你的脚本中依赖它,除非你想让它们依赖于 systemd。
在使用 systemd 的系统上,将在图形模式(通过、等)和文本模式会话(通过 )中$XDG_VTNR
进行设置。lightdm
gdm
/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.exec
和pam_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 会话终止时,您将被注销。