我使用的是“版本7.1 (Maipo)”。当我处于非登录shell中时,最小shell级别(echo $SHLVL)从最低级别2开始,并随着后续的子shell而增加。但是,当我使用登录shell时,最小shell级别(echo $SHLVL)从最小的shell级别2开始,并随着后续的子shell而增加。
为什么登录shell (从最低shell级别1开始)和非登录shell级别(从最低shell级别2开始)之间存在最小shell级别的差异?

我用的是bash。
发布于 2018-01-12 08:07:23
来自bash手册页:
每次启动bash实例时,SHLVL都会增加一个。
正如您所看到的,这个变量与它是否是登录shell无关。这只意味着bash已经由另一个bash启动。由于我们不知道您究竟在做什么来获得shell,所以我不能说为什么您有嵌套的shell调用,但是下面是一些常见的情况:
发布于 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似乎是这样做的。
https://unix.stackexchange.com/questions/416518
复制相似问题