由桌面文件启动的 gnome-terminal 是什么类型的 shell?

由桌面文件启动的 gnome-terminal 是什么类型的 shell?

我正在测试运行 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/.profilesage提供了一个类似于命令行的环境,您可以在其中运行 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。这就是为什么.bashrcor.bash_profile未被读取的原因。

在第二个示例中,您手动gnome-terminal使用默认 shell启动bash交互的模式,这将设置所需的环境变量,从这里您启动另一个gnome-terminal继承这些环境变量的变量,这就是它们保持设置的原因。


您可以做的一种可能性是为您的命令编写一个 shell 脚本包装器Sage,然后从文件中的 gnome-terminal 启动它.desktop

另一种可能性是将bash -l -c Sage或传递bash -i -c Sagegnome-terminal命令行,即在两者之间明确添加 shell。您需要告诉它像交互 shell 或登录 shell 一样运行。

如果您需要做的只是设置一些环境变量,则可以使用命令env代替 shell:gnome-terminal以执行的命令开始env DOT_SAGE=blahblah Sage。如果您不介意必须在两个不同的地方维护此环境变量,这可能是最简单的方法。

另一种可能性是设置所需的环境变量,使其已经为图形环境启动的每个进程设置。.bash_profile.xsession或者.xprofile可能是正确的地方;可惜您必须不方便地从图形会话中注销并重新登录才能使更改生效。(图形登录时读取的确切文件可能因发行版、图形环境、登录方法而异,并且可能多年来发生了变化,这就是为什么我的答案在这里有点模糊。)

相关内容