在 Gnome 中,GUI 应用程序不会继承PATH
启动它们的 shell 进程吗?显然,GUI 应用程序只能PATH
看到~/.profile
.不过,控制台应用程序没有问题。
如果我从 Bash 会话中启动当前可用的 GUI 应用程序PATH
,那么它们将无法启动。例如:
- Thunderbird 找不到该
libxpcom.so
库(它位于其文件夹中)。但是,该which
命令找到该库(因为该文件夹位于PATH
)。 - Firefox 失败并显示“找不到 Mozilla 运行时。”
添加PATH
并LD_LIBRARY_PATH
不能解决问题。
但是,如果我:
- 设置
PATH
并~/.profile
重新启动 Gnome 会话; - 或在启动应用程序之前切换到应用程序的文件夹;
然后我可以从我的 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。