根据答案什么是登录 shell 和非登录 shell?在 Ask Ubuntu 上,GNOME 终端是一种非登录 shell。正如这本优秀书中所指出的,Fedora 和 Red Hat Enterprise Linux 实用指南,第六版:
交互式非登录 shell 执行 ~/.bashrc 文件中的命令。默认的 ~/.bashrc 文件调用 /etc/bashrc。
因此,/etc/profile
不会在非登录 shell 中进行处理。但是,我发现我已将 java 主路径附加到PATH
变量中,并且当我使用 GNOME 终端并发出命令时java
,一切正常。另外,该变量的值PATH
与我在 中定义的值相同/etc/profile
。
鉴于上述事实,存在冲突,我的理解有什么问题吗?
答案1
当您通过显示管理器或在 tty 中登录到您的 x 会话时,/etc/profile
(通常 - 显然它是在您的情况下,尽管某些图形 shell 不读取它)由您的 shell 程序获取。之后,将获取本地文件(我假设您在这里使用 bash)或~/.bash_profile
,并且此处定义的任何环境变量都将覆盖当前用户。这个环境是~/.bash_login
~/.profile
/etc/profile
遗传通过您在会话中打开的任何 shell。这就是为什么我们可以定义环境变量,例如这些文件中的 PATH。
当您打开 gnome-terminal 时,默认情况下会启动非登录 shell,但它会继承已从登录 shell 或图形 shell 加载的用户环境。由于是~/.bashrc
在启动交互式 shell 时获取的(例如打开 gnome-terminal),因此它可用于覆盖一些环境元素(例如 PS1)。
(gnome-terminal本身是一个应用程序,而不是一个shell)
答案2
短:无
long:gnome-terminal 是一个终端。您在终端中运行 shell。您可以在终端中运行任一类型的 shell(登录或不登录)(尽管 gnome-terminal 比其他终端更难)。
进一步阅读:
答案3
试试这个,它在 BASH 中有效。
shopt -q login_shell && echo " <<< It's a Login Shell >>> " || echo " <<< It's \"NOT\" a Login Shell >>> "
顺便说一句,Gnome Terminal 只是一个使用 shell(更具体地说是 BASH)的终端模拟器(应用程序)。