为什么代理设置在终端中有效但在桌面启动器中无效
把代理配置放在桌面真正的启动边界上,并使用桌面条目的命令格式,而不是对 shell 启动过程的假设。
你在终端里导出了代理。在那里启动的命令会使用它。点击桌面图标却仍然走另一条路径。图标并没有成为该终端的子进程。
桌面会话通过自己的启动机制来启动应用。那些进程继承的是那个环境,而不是在无关 shell 里后来所做的每一次修改。这可以解释差异,但并不能证明应用包有缺陷。
Exec 是命令描述,不是 shell 脚本
Desktop Entry 规范为 Exec 指定了可执行文件和参数。它并不承诺 shell 变量展开,也不承诺 shell 内建命令。
对于读取相关环境变量的外部程序,有意限定范围的启动可以是这样:
Exec=env https_proxy=http://proxy.example:8080 /path/to/application端点与可执行文件都需要替换。这展示的是启动输入,而不是保证任意应用都会读取该变量。带有自己明确代理策略的浏览器仍可能选择另一个配置来源。对于 Chrome,请把它的代理参数写进用户启动器。
不要写 Exec=export ... 然后指望桌面把它当成你的登录 shell 来解释。还要留意桌面条目的引号规则和支持的字段代码;它们是另一个解析器。
检查是否真的启动了什么新进程
有些应用会把请求发给已经在运行的实例。有些条目使用 D-Bus 激活,而它有自己的一套启动路径。新点一次图标并不会建立带刚刚编辑的 Exec 环境的全新进程。
先确定发出请求的实例,以及它真正拥有的配置。必要时,受控的新启动可以缩小比较范围。在确认目标环境究竟有没有到达它之前,不要重装应用。