首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在RHEL 7中,$SHLVL从2级开始,而在1级登录shell?

为什么在RHEL 7中,$SHLVL从2级开始,而在1级登录shell?
EN

Unix & Linux用户
提问于 2018-01-12 06:46:42
回答 2查看 6.6K关注 0票数 3

我使用的是“版本7.1 (Maipo)”。当我处于非登录shell中时,最小shell级别(echo $SHLVL)从最低级别2开始,并随着后续的子shell而增加。但是,当我使用登录shell时,最小shell级别(echo $SHLVL)从最小的shell级别2开始,并随着后续的子shell而增加。

为什么登录shell (从最低shell级别1开始)和非登录shell级别(从最低shell级别2开始)之间存在最小shell级别的差异?

我用的是bash。

EN

回答 2

Unix & Linux用户

发布于 2018-01-12 08:07:23

来自bash手册页:

每次启动bash实例时,SHLVL都会增加一个。

正如您所看到的,这个变量与它是否是登录shell无关。这只意味着bash已经由另一个bash启动。由于我们不知道您究竟在做什么来获得shell,所以我不能说为什么您有嵌套的shell调用,但是下面是一些常见的情况:

  • 从命令行启动一个新的终端窗口。
  • 您正在使用一些OS功能来启动一个新的终端窗口,实现此功能的方法是先启动bash,然后运行终端,然后再运行一个新的shell。
  • 您的.bash_profile中有一个递归的.bash_profile调用,它在SHLVL =1时运行(这听起来很奇怪,但我已经看过两次了!)
票数 3
EN

Unix & Linux用户

发布于 2018-01-12 08:05:29

当您登录到GUI会话时,设置会话的脚本将在非交互式登录shell中执行。它读取/etc/profile~/.[bash_]profile等,并为整个GUI会话设置环境。然后,shell执行一个启动桌面环境的脚本。实际上,对于您的会话,该shell将是SHLVL 1。

X会话设置脚本可能实际上是激发桌面环境的最后一个命令exec。这就解释了为什么您无法在会话的进程树视图(ps xf)中找到一个shell进程:该shell完成了它的工作,并且消失了,只有它的环境变量(以及任何其他可继承的设置,如自定义ulimits)由桌面环境的主进程继承,并将它们传递给它的所有子进程。这样,从桌面菜单启动的程序也会有您可能在.bash_profile中设置的任何环境变量,因此将如您所期望的那样工作。

也可以设置终端窗口作为登录shell启动,因此它们将是SHLVL 1。至少Debian上的KDE似乎是这样做的。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/416518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档