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
只设置环境变量,如PATH
和LC_MESSAGES
.bashrc
为less
和等应用程序设置一些 bash 特定设置和别名以及环境变量grep
。
效果(在wayland之前)如下:
- 当我以图形方式登录时,会读取并设置诸如和 之
.profile
类的环境变量。当我在终端模拟器中打开 bash 时,就会被读取。PATH
LC_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.env
和startup_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
我同意,这不是最优雅的解决方案,但是,据我测试,它似乎可以完成工作。