在Wayland上为gnome设置环境变量,在虚拟终端(或ssh)上为bash设置环境变量


13

Gnome 3.22默认使用Wayland。Wayland上的Gnome无法读取~/.profile(或~/.bash_profile/etc/profile)。见https://bugzilla.gnome.org/show_bug.cgi?id=736660

我的初始化文件设置如下:

  • .bash_profile什么也不做,但源.profile.bashrc
  • .profile只设置环境变量,例如PATHLC_MESSAGES
  • .bashrc为诸如less和的应用程序设置一些特定于bash的设置,别名和环境变量grep

效果(在Wayland之前)如下:

  • 当我以图形方式登录时.profile,会读取并设置PATHLC_MESSAGES设置环境变量。当我在终端仿真器中打开bash时,会.bashrc被读取。
  • 当我在虚拟终端下登录时.bash_profile,将读取.profile并依次读取和.bashrc
  • 当我使用ssh登录时,行为类似于虚拟终端。

在所有情况下.profile.bashrc均已阅读并且设置了我的环境。

因此,现在gnome 3.22使用了Wayland,而Wayland无法读取.profile。如何设置初始化文件,以便再次获得如上所述的效果?

请注意,我不坚持.profile读取某些文件(如)。我想要以一种明智的方式来设置我的环境。这意味着我想将bash特定设置保留在bash初始化文件中,并将其他设置保留在其他初始化文件中。另外,我也不想在其他文件上复制设置。

我使用arch linux。欢迎所有发行版本的答案。当提出解决方法时,请同时描述副作用以及优缺点。


更新2017年11月:据我了解GNOME开发者都承认,人们期待他们的登录shell的配置文件(.profile.bash_profile在bash的情况下)在登录后采购。无论是文本登录还是图形登录。因此,我上面概述的用例再次起作用。

gnome开发人员仍然希望远离启动登录shell。看来他们的发展方向是使用systemd环境的:

https://in.waw.pl/~zbyszek/blog/environmentd.html

似乎需要一段时间才能使所有登录方法适应环境。

Answers:


7

系统版本233(2017年3月)增加了对在中设置环境变量的支持~/.config/environment.d/*.conf。见environment.d男子页,并导致对功能的讨论这个初步PR这最后一个


这似乎是一个很好的解决方案。我做了一个快速测试。它可以在gnome wayland中运行,但不能在虚拟终端中运行。我认为它也将不适用于ssh。我已经阅读了手册页,但只是略过了讨论。您知道这是否还将在虚拟终端和ssh中起作用吗?
lesmana '17

1
以下是有关情况的一个很好的摘要:in.waw.pl/~zbyszek/blog/environmentd.html。最后一段说对虚拟终端(和ssh?)的支持“可能”到来。至少如果我理解正确的话。
lesmana

哦,有趣的是,我没有意识到GDM必须为此添加特殊的支持。是否可以进行某种安排,即所有类型的会话都是单个用户服务进程的子进程,而该进程已经解析了这些env变量,并且所有这些都可以工作,而GDM / sshd无需了解任何信息?
杰克·奥康纳

1
在使用GDM / Wayland的Fedora 30上,这对我不起作用。
jonleighton

“解决方案”缺少合理的用例:如果为A,则设置B。作为一个示例,如果XDG_SESSION_TYPE = wayland,则设置QT_QPA_PLATFORM = wayland。
vk5tu

5

这是我用于完全相同的问题的解决方法:

步骤1

创建一个源代码~/.profile并使该脚本可执行的脚本。叫它/path/to/startup.sh。它可能看起来像这样:

#!/bin/bash
. ~/.profile

第2步

创建一个桌面应用程序以运行脚本。为此,您需要创建一个.desktop文件并将其放入~/.local/share/applications(或者/usr/share/applications如果您希望它对所有用户都有效)。叫它~/.local/share/applications/startup.desktop。它可能看起来像这样:

[Desktop Entry]
Name=Startup
Keywords=startup
Exec=/path/to/startup.sh
Type=Application

有关.desktop文件的更多信息,请参见此处

第三步

登出。重新登录。您现在应该可以在应用程序菜单中搜索您的应用程序。

步骤4

将此应用程序设置为启动应用程序。为此,我使用了Gnome调整工具,并将我的应用程序添加到“启动应用程序”选项卡的列表中。

就是这样!现在,无论何时登录,都应该恢复原来的功能。它还可以完整保留文件结构,因此,当Wayland中的错误修复后,只需执行以下操作,即可从启动应用程序列表中删除该应用程序,并删除两个文件一切恢复正常。

以后编辑

正如@Guss在评论中指出的那样,此解决方法不会导出环境变量,因为它startup.sh是在其自己的Shell中运行的。因此,我们需要针对这些问题的另一种解决方法。

阅读GNOME文档,您会发现有几种选择。我唯一可以使用的方法是在其中创建一个文件,/usr/share/gdm/env.d/然后在该文件中放置要导出的变量。但是,这意味着将为所有用户导出变量,所以我最终要做的是:

假设我们有两个用户johnsally。为其中的每个创建一个文件/usr/share/gdm/env.d/,我们称它们为startup_john.envstartup_sally.env。在这些文件中放置启动新的GNOME会话时要导出的环境变量。

$ cat startup_john.env
VAR=1
$ cat startup_sally.env
VAR=2

此时的问题是两个文件将同时为两个用户加载。为了解决此问题,我们在每个文件上设置了权限,以便只有其所有者才能读取其内容。

$ ls -l startup_john.env
-rw-r-----. 1 john john 4 Dec 27 15:17 startup_john.env
$ ls -l startup_sally.env
-rw-r-----. 1 sally sally 4 Dec 27 15:16 startup_sally.env

我同意,这不是最优雅的解决方案,但是据我测试,它似乎可以完成工作。


我尚未对此进行测试,但是它不应该startup.sh运行,因为它在自己的shell中运行,并且不会将环境变量导出到父执行上下文。例如,尝试在您的shell中运行以下代码:echo "a is $a"; (export a="B"); echo "a is $a" 。根据@Tudor的说法,第二个回显的输出将是a is B,这不会-会在您运行代码时看到。
格斯

@Guss,您好。我没有注意到,但是,既然您已指出,我也找到了解决环境变量的方法。我将相应地更新我的答案。
Tudor Vișan

1
请这样做,我很乐意看到您的想法。另外,我认为当您说“当Wayland中的错误得到修复时”时,您会非常乐观-这不是Wayland中的错误,而是GNOME中的问题,而GNOME人们并不认为这是一个错误-这是有据可查的行为:Wiki .gnome.org / Initiatives / Wayland / SessionStart
Guss,

令人震惊的是,这仍然没有得到解决。所有这些只是为了获取我的.profile?!?
RichieHH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.