我正在测试运行 Ubuntu 22.04。我不明白为什么使用 .desktop 文件打开 gnome 终端时$HOME/.bashrc
无法读取,但在打开的终端中运行相同命令时却可以读取。更具体地说,我有一个文件/home/rquint/.local/share/applications/Sage.desktop
包含以下行
EXEC=gnome-terminal --class=SageTerminal -- /home/rquint/Sage/sage-9.6/sage
我有
export DOT_SAGE=/home/rquint/dotsage
在/home/rquint/.bashrc
如果我使用桌面文件启动 Sage,它可以正确运行,但值DOT_SAGE
是 Sage 默认值/home/rquint/.sage
如果我打开一个终端(我可以在其中检查DOT_SAGE
并且它是我在中导出的值.bashrc
)并执行
gnome-terminal --class=SageTerminal -- /home/rquint/Sage/sage-9.6/sage
sage 在终端启动,并且的值DOT_SAGE
是正确的。
我曾假设 Sage.desktop 文件启动的终端是非登录 shell,但如果不是,那它是什么?有没有办法将我想要的环境变量的值传递给它?
(在过去这并不重要,但随着 Firefox 的改变,sage 将 plot3d 输出显示为包含隐藏文件夹的路径中的 html 文件的方法不再起作用。)
谢谢@egmont(在此回答...)这是一种“是与否”的问题。你关于使用的建议env
非常有帮助。在搜索 AskUbuntu 时,我发现了一个老问题和答案带有 bashrc 环境的桌面文件 这也给了我一些启发。当我开始sage
使用桌面文件时,我确实会得到一个非交互式 shell,这意味着我可以DOT_SAGE
在 中设置我的变量$HOME/.profile
。 sage
提供了一个类似于命令行的环境,您可以在其中运行 shell 命令。我可以执行类似操作echo $SHELL
(我的是 bash)并测试 sage 在哪种 shell 中运行[ -z "$PS1" ] && echo "Noninteractive" || echo "Interactive"
(我的是非交互式的)。您可以运行pwd
但不能使用cd
。
答案1
我曾假设 Sage.desktop 文件启动的终端是一个非登录 shell
终端和壳是两回事。终端不能是A登录外壳或非登录 shell。 A壳可以是登录 shell 或非登录 shell。终端可以发射其本身是一个登录 shell、一个非登录 shell,或者两者都不是。
当您告诉gnome-terminal
启动哪个命令时,它会启动该命令代替您的默认 shell。也就是说,它不会启动任何 shell。
在您的第一个示例中,根本没有bash
涉及任何 shell,终端直接启动 Sage,游戏中没有任何 shell。这就是为什么.bashrc
or.bash_profile
未被读取的原因。
在第二个示例中,您手动gnome-terminal
使用默认 shell启动bash
交互的模式,这将设置所需的环境变量,从这里您启动另一个gnome-terminal
继承这些环境变量的变量,这就是它们保持设置的原因。
您可以做的一种可能性是为您的命令编写一个 shell 脚本包装器Sage
,然后从文件中的 gnome-terminal 启动它.desktop
。
另一种可能性是将bash -l -c Sage
或传递bash -i -c Sage
到gnome-terminal
命令行,即在两者之间明确添加 shell。您需要告诉它像交互 shell 或登录 shell 一样运行。
如果您需要做的只是设置一些环境变量,则可以使用命令env
代替 shell:gnome-terminal
以执行的命令开始env DOT_SAGE=blahblah Sage
。如果您不介意必须在两个不同的地方维护此环境变量,这可能是最简单的方法。
另一种可能性是设置所需的环境变量,使其已经为图形环境启动的每个进程设置。.bash_profile
,.xsession
或者.xprofile
可能是正确的地方;可惜您必须不方便地从图形会话中注销并重新登录才能使更改生效。(图形登录时读取的确切文件可能因发行版、图形环境、登录方法而异,并且可能多年来发生了变化,这就是为什么我的答案在这里有点模糊。)