shell的初始化
在命令行模式下,为什么我们敲一个命令,这个命令就可以马上执行?命令是如何执行的?shell到底是个什么东西?把shell是什么搞清楚了,把shell初始化搞清楚了,基本上也就搞清楚了shell命令是如何执行的。
在Linux环境下,我们运行的软件、命令、自己编写的ELF文件,都是以“进程”形式运行的。系统上电后,需要对硬件做各种初始化、对操作系统模块各种初始化、会启动很多后台服务进程。
在一个计算机中,系统上电后,运初始化顺序是:
BIOS-->操作系统-->init进程-->用户登录-->shell进程
BIOS是固化在主板上的一段程序,系统上电后会首先从这里执行,操作系统镜像文件安装在磁盘上,会被加载到内存中启动。操作系统有很多模块(进程管理、文件系统、任务调度),在启动过程中会分别初始化。
操作系统初始化完毕后,会启动第一个用户进程init,init进程是所有用户进程的祖先,后面所有的进程都是通过复制(fork)init进程而来的。init进程会解析/etc目录下的配置脚本(/etc/inittab、/etc/event.d、/etc/init.d等),启动各种系统服务和后台进程,不同的系统启动的服务不一样。init进程通过配合文件让系统进入不同的运行级别,可以启动不同的系统服务程序。
为了方便后续用户的登陆,init进程会在配置脚本里初始化一系列终端:
tty1
tty2
tty3
tty4
tty5
tty6
不同的系统,使用的init程序不一样,启动脚本也不一样,但大致的初始化顺序大同小异。早起的init程序是system V init,现在比较常用的是upstart和systemd。
创建好终端之后,接下来就要启动登录系统了。不同的运行级别启动的登陆程序可能不一样。用户的登陆方式一般分为三种:本地命令行登录、SSH远程登录、图形界面登录。
Ubuntu系统默认的运行级别是2,在/etc/init/rc- sysinit.conf设置,会默认启动图形化模式,启动桌面管理器,显示登录界面。用户输入用户名和密码后,login服务进程验证正确后,就会启动KDE、GNOME等桌面管理器,初始化相关的桌面环境,用户点击一个应用程序图标,这个应用程序就会已进程的形式运行,用户点击关闭按钮,软件退出,进程被杀死。
Terminal是Ubuntu环境下默认的一个虚拟终端工具,当用户点击桌面上的Terminal按钮,或者通过鼠标右键弹出的菜单:Open Terninal去打开一个虚拟终端工具时,该软件运行,并启动一个默认的shell解释器(如Bash),进入交互式环境,执行用户输入的各种命令。
Bash本身也是一个二进制程序文件,提供给用户一个交互式的命令行模式,当用户输入一个命令时,Bash会创建一个子进程来运行该命令,命令运行结束后,子进程退出,再回到交互式的环境。常见的shell解释器除了bash之外,还有sh、csh、tcsh、zsh等,用户甚至自己都可以编写一个shell解释器。如果你对shell比较感兴趣,想自己动手实现一个,可以参考这个教程:Linux系统编程:从零实现一个shell解释器该教程会首先讲解Linux系统编程的基础知识,然后从零开始实现一个简单的shell解释器,跟着视频教程做完这些,会让你对shell有更深一步的理解。
如果你需要远程登录Linux服务器,此时就需要在文本模式下登录Linux系统了。文本模式运行在另一个运行级别,会启动一个login程序,提示用户输入用户名和密码,验证成功后,或启动一个默认的shell解释器(如Bash),进入交互式命令行模式。在桌面环境下敲击ctrl+Alt+F3,就会通过tty3终端启动一个登陆进程,接受用户的输入用户名和密码,验证通过后,会启动一个Bash解释器进程跟tty3终端绑定在一起,接受用户的各种输入命令并执行。
TIPS:在Ubuntu18.04下面,切换到图形模式使用快捷键:Ctrl+Alt+F2、Ctrl+Alt+F1。不同的Linux发行版本,甚至同一Linux发行版本的不同版本之间,快捷键也有一些差异,实际操作请以自己具体的环境为准。