login shell与non-login shell,interactive shell与non-interactive shell

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了login shell与non-login shell,interactive shell与non-interactive shell相关的知识,希望对你有一定的参考价值。

bash有几种不同的运行模式,login shellnon-login shellinteractive shellnon-interactive shell(比如执行shell脚本)。这两种分类方法是交叉的,也就是说一个login shell可能是一个interactive shell,也可能是个non-interactive shell。

在下列情况下,我们可以获得一个login shell:

  1. 登录系统时获得的顶层shell,无论是通过本地终端登录,还是通过网络ssh登录。这种情况下获得的login shell是一个交互式shell。
  2. 在终端下使用–login选项调用bash,可以获得一个交互式login shell。
  3. 在脚本中使用–login选项调用bash(比如在shell脚本第一行做如下指定:#!/bin/bash --login),此时得到一个非交互式的login shell。
  4. 使用"su -“切换到指定用户时,获得此用户的login shell。如果不使用”-",则获得non-login shell。

login shell与non-login shell的主要区别在于它们启动时会读取不同的配置文件,从而导致环境不一样。

login shell的行为:

login shell启动时首先读取/etc/profile全局配置,然后依次查找~/.bash_profile~/.bash_login~/.profile三个配置文件,并且读取第一个找到的并且可读的文件。login shell退出时读取并执行~/.bash_logout中的命令。

non-login shell的行为:

交互式的non-login shell启动时读取~/.bashrc资源文件。非交互式的non-login shell不读取上述所有配置文件,而是查找环境变量BASH_ENV,读取并执行BASH_ENV指向的文件中的命令。

如果使用命令"sh"调用bash,bash会尽可能保持向后兼容。作为login shell启动时,bash依次读取/etc/profile和~/.profile配置文件。作为non-login shell启动时,bash读取环境变量ENV指向的文件。

通常我们要定制一些配置时,将配置写在/.bashrc中,然后在/.bash_profile中读取~/.bashrc,这样可以保证login shell和交互式non-login shell得到相同的配置。至于/etc/profile就不要轻易去改啦,毕竟会影响系统全局的配置。
下面做个简单的实验来验证上面的描述。在~/.bash_profile中设置如下变量:

lshell="login shell will see this message"
[sw@gentoo ~]$ bash
[sw@gentoo ~]$ echo $lshell

[sw@gentoo ~]$ exit
exit
[sw@gentoo ~]$ bash --login
[sw@gentoo ~]$ echo $lshell
login shell will see this message
[sw@gentoo ~]$ exit
logout

其实我们最关心的还是sh方式执行的shell的文件读取,因为这是用得最多的。

以上是关于login shell与non-login shell,interactive shell与non-interactive shell的主要内容,如果未能解决你的问题,请参考以下文章

login shell 和 non-login shell 的区别

/etc/profile与/etc/bashrc交互式与非交互式login与non-login shell的差别

login shell 和 non-login shell 的区别

交互式shell与非交互式shell

linux_shell 编程学习-初识she'll

[转] - bashrc与profile的区别