从 gnome/nautilus 运行的 Bash 脚本没有环境变量

从 gnome/nautilus 运行的 Bash 脚本没有环境变量

在我的 ~/.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 脚本。

相关内容