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

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

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
  • .bashrcless和等应用程序设置一些 bash 特定设置和别名以及环境变量grep

效果(在wayland之前)如下:

  • 当我以图形方式登录时,会读取并设置诸如和 之.profile类的环境变量。当我在终端模拟器中打开 bash 时,就会被读取。PATHLC_MESSAGES.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

看来所有登录方式都需要一段时间才能适应环境。

答案1

Systemd 版本 233(2017 年 3 月)添加了对在~/.config/environment.d/*.conf.看手册environment.d以及导致该专题的讨论这个初步公关这最后一个

答案2

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

步骤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有关文件的更多信息,请参阅这里

步骤3

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

步骤4

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

就是这样!现在,无论何时登录,您都应该恢复旧功能。它还完整地保留了文件结构,因此,当 Wayland 中的错误得到修复时,您所需要做的就是从启动应用程序列表中删除该应用程序,删除这两个文件一切都恢复正常了。

稍后编辑

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

读自GNOME 文档您可以看到有几种选择。我唯一可以做的就是创建一个文件,/usr/share/gdm/env.d/并在该文件中放置要导出的变量。但是,这意味着将为所有用户导出变量,所以我最终要做的是:

假设我们有两个用户,约翰莎莉。为每个文件创建一个文件/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

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

相关内容