在我的 ~/.bashrc 和 ~/.profile 中,我将一些变量设置为一些文件路径:
export MY_VAR1="/path/to/somewhere"
在我的 ~/bin/ (添加到我的 PATH 中)中,我有一些依赖于所设置的变量的脚本。
如果我从终端运行这些命令,它们就会按预期工作。
但是,如果我尝试双击 Nautilus 中的脚本并运行它,它会像未设置这些变量一样运行。
如果我使用 GUI 实用程序将其中一个脚本添加到 Gnome 的“启动应用程序”,或者使用“主菜单”GUI 实用程序将它们添加到 Gnome 菜单,也会发生同样的情况。
我本以为,既然我将这些变量包含在我的 ~/.profile 中(在登录时运行),那么 gnome 和 nautilus 以及它们生成的进程就可以访问这些变量。
Gnome 和 Nautilus 都在我的登录用户下运行。我在 ~/bin 中的所有脚本的顶部都有 bash shebang。
我是 bash 脚本新手,如果我遗漏了一些明显的东西,抱歉。我正在使用 Debian Wheezy 和 Gnome3。
答案1
这是因为启动 X 会话永远不会读取您的~/.bashrc
和~/.profile
。通常,桌面管理器是作为 root 或其自己的用户从 init 脚本启动的。当它到达桌面管理器启动脚本时,生成的进程通常具有 init 进程的环境。 (此时我不会谈论不太成熟的 init 实现。)
登录后,它会生成一个子进程,该子进程仅继承该环境。子进程将授予您的 uid 权限并运行/etc/X11/Xsession
,这通常只是运行 中的所有脚本/etc/X11/Xsession.d
。这些脚本通常要么设置环境变量,要么专门修改桌面环境的调用。
在该目录中,您可能会找到一个类似于 Debian 系统上的文件40x11-common_xsessionrc
,该文件将您的~/.xsessionrc
.最后一个文件/etc/X11/Xsession.d
将启动您的桌面环境。您的所有 GUI 进程都将从该进程生成,从而继承通过设置的环境,/etc/X11/Xsession.d
从而继承您的~/.xsessionrc
.
~/.xsessionrc
是一个脚本文件,它可能会使用源代码,~/.bashrc
但这确实是很糟糕的风格,因为然后你的 DE 源代码会继承该环境,然后~/.bashrc
再次使用 bash 源代码,这可能会产生不需要的副作用。
但是,使用 a 是完全可以接受的~/.myenvironmentvariables
,它包含严格的(环境)变量定义,并且来源为~/.bashrc
和~/.xsessionrc
。如果这样做,您的所有进程都将继承 中指定的变量~/.myenvironmentvariables
,尤其是您在 Nautilus 中双击的 shell 脚本。