什么是shell?
shell是一个程序,它和kernel(内核)进行交互,它从用户那里获取输入指令发送到kernel,在kernel执行指令后的结果返回输出给shell。在没有GUI(图形)的时代,shell是系统的主要界面,也是和kernel交互的唯一方式。 虽然现在可以通过GUI完成某些操作,但是shell的强大是GUI无法完全取代的。
Login Shell(登录式shel)和Non-Login Shell(非登录式shell)
Login Shell
当我们通过终端登录一台主机时,主机默认会为我们启动一个shell,因为这个shell是在登录后启动的,所以我们可以理解为,它是Login Shell。在sudo命令-i参数、su命令-l参数也都提到了Login Shell。
判断是否是Login Shell,可以使用echo $0,如果打印出来的名称是-bash或是-su,第一个字符是“-”,就说明这是一个Login Shell,又或是在docker命令中使用了--login参数,这也是个Login Shell。
Login Shell执行以下脚本:/etc/profile、/etc/profile.d/中脚本、当前用户~/.bash_profile、当前用户~/.bashrc、执行/etc/bashrc
Non Login Shell
Non Login Shell是通过Login Shell启动的shell,例如,登录主机后,输入bash命令再启动一个shell,这个shell就是Non Login Shell。
Login Shell执行以下脚本:~/.bashrc、/etc/bashrc、/etc/profile.d
同样Non Login Shell也可以通过$0输出结果来判断,echo $0打印出来的结果是bash或su,可以认为是Non Login Shell。
补充:检测当前是否是Login Shell,还可以通过输入logout命令,如果当前是Login Shell,执行结果相当于exit,如果不是Non Login Shell会提示logout: not login shell。
interactive shell(交互式shell)和non-interactive shell(非交互式shell)
我们日常在终端中使用的就是interactive shell,即输入提交命令,返回结果。
当我们执行shell脚本时,bash helloword.sh,此时的shell就是non-interactive shell