GUI 应用程序不会从父控制台应用程序继承 PATH

GUI 应用程序不会从父控制台应用程序继承 PATH

在 Gnome 中,GUI 应用程序不会继承PATH启动它们的 shell 进程吗?显然,GUI 应用程序只能PATH看到~/.profile.不过,控制台应用程序没有问题。

如果我从 Bash 会话中启动当前可用的 GUI 应用程序PATH,那么它们将无法启动。例如:

  • Thunderbird 找不到该libxpcom.so库(它位于其文件夹中)。但是,该which命令找到该库(因为该文件夹位于PATH)。
  • Firefox 失败并显示“找不到 Mozilla 运行时。”

添加PATHLD_LIBRARY_PATH不能解决问题。

但是,如果我:

  1. 设置PATH~/.profile重新启动 Gnome 会话;
  2. 或在启动应用程序之前切换到应用程序的文件夹;

然后我可以从我的 Bash 会话运行任何 GUI 应用程序,没有任何问题。事实上,目前我已经诉诸使用模拟第二个过程的脚本。

有什么问题?我应该使用 GUI 应用程序启动器吗?

我不想把我的习惯放进PATH~/.profile,因此这个问题。

感谢您的关注。

环境:

  • Debian GNU/Linux:6.0.7
  • 侏儒版本:2.30.2

编辑:我不知道 Gnome 是如何启动的:我安装了带 GUI 的 Debian,它在图形登录屏幕后默认启动 Gnome。

Bash 是通过命令“gnome-terminal --full-screen”从 Gnome 面板启动的。

编辑2:

感谢 Bob 的建议,我尝试运行bash --norc- 即:使用默认配置的 Bash - 然后手动添加 Thunderbird 和 Firefox 的路径 - 喘息! - 现在两个应用程序都可以正常启动。我该如何解决这个问题?我的~/.bashrc只是一堆补充PATH。此外,该which命令可以很好地解析firefox两者thunderbird。也许我的中存在相互隐藏的库PATH?无论如何,LD_LIBRARY_PATH始终是空的。

我认为解决方案可能是为每个 GUI 应用程序提供一个启动器脚本,就像评论者建议的那样。

答案1

对此的大部分困惑是因为它因 Linux 发行版而异。一般来说...

  • /etc/profile 仅在启动时获取。
  • /etc/profile 来源 /etc/profile.local(如果存在)。
  • /root/.bashrc 来源...
    • 启动时,在 /etc/profile 之后。
    • 打开新的终端会话时。
  • 只有在终端会话命令行上输入的命令才会使用小路在/root/.bashrc 中设置。
  • 由 Gnome 这样的 GUI 执行的脚本和程序使用小路在 /etc/profile 中设置
  • 由于 /etc/profile 执行 /etc/profile.local(如果存在),然后更改和添加小路通常最好在那里完成。请记住“导出 PATH”,以便所有子 shell 都能看到它。

我知道这是基于 Ubuntu 10.04 的 Puppy Linux 5.2.8 Lupu 上的行为,研究表明它很常见,至少对于许多基于 Debian 的发行版(如 Ubuntu)来说是这样。

您可能认为 $HOME/.profile(类似于 /etc/profile 系统范围脚本的用户脚本)中设置的 PATH 适用于 Gnome 等非终端会话,但事实并非如此。 Xwindows GUI 和各种显示管理器等(例如 Gnome)与终端会话并行运行,因此不会继承 $HOME/.bashrc 设置。

似乎大多数程序都有责任在必要时重置 PATH。以下命令将显示数十甚至数百个包含“PATH=”的文件...

grep -r 'PATH=' /etc/*

与问题相关性的说明

我的机器上当前的进程层次结构显示在命令的编辑输出中......

ps -efH | cut -c49-126
----------------------
/bin/busybox init
  /bin/sh /usr/bin/xwin
    /usr/bin/xinit /root/.xinitrc -- -br -nolisten tcp
      X :0 -br -nolisten tcp
      openbox
        /bin/ash /sbin/pup_event_frontend_d
          sleep 2
  /usr/local/apps/ROX-Filer/ROX-Filer -p /root/Choices/ROX-Filer/PuppyPin
    roxterm
      gnome-pty-helper
      -sh
      -sh
      -sh
      -sh
      -sh
      -sh
        ps-FULL -efH
        cut -c49-126
    geany
  • 在大多数系统上,输出的第一行只是“init”,但 Puppy 用“busybox”替换了许多这样的命令。
  • 请注意,启动 Xwindows 子系统的“xwin”由“init”运行。
  • 向下移动,请注意 ROX-Filer 充当桌面管理器,与“xwin”处于同一级别,“roxterm”类似于“gnome-terminal”,“-sh”进程是多个 bash 终端会话我已在其选项卡中打开。
  • Geany 是正在运行的 GUI 编辑器,与 Xwin 和 ROX-Filer 处于同一级别。

导出的环境变量(如 PATH)仅从启动它们的进程(例如它们的“父进程”)继承。 ps 输出没有显示它,但 /etc/profile(和 /etc/profile.local)是“init”启动过程中读取的众多脚本之一,因此“xwin”可以看到其中设置的 PATH。但是,由于 .bashrc 是不是这些脚本之一,其他 GUI 程序无法看到其中设置的 PATH。

图形用户界面程序如果您从 bash 命令行启动它们,则能够看到 .bashrc PATH。

相关内容