目录
- 前言
- 什么是shell,什么是bash?
- ls -l 执行过程
前言
学习操作系统的过程中我们经常在自己的shell中执行一些Linux命令,那么当我们输入一个类似于 ls -a 这样的命令式,发生了什么?
换句话说,从我们在shell中输入ls -a 按下回车之后,这条命令在linux底层是怎么被执行的?下面我们详细分析!
什么是shell,什么是bash?
shell是一种处于用户态运行的解释器(也是进程),相当于操作系统的"使用界面",是用户和内核通信的中间桥梁, 好比内核的外壳, 我们用户通过对shell的交互,来实现对系统的操作;
而bash(/bin/bash)就是linux中默认的shell。他是随着用户连接OS后,启动的不断运行的一个进程;
ls -l 执行过程
回答前言中提出的问题,shell命令框中输入一个ls -l 然后会发生什么?
如下图:
当某个用户连接系统的时候,会随之创建一个属于他的shell(bash)进程,形成终端界面,等待使用者输入命令进行操作;
当我们按下ls -l后:
- shell的main(argc,argv)函数会以命令行传参的形式读取字符串 ls 和 -l,内部解析出命令名称 ls 和参数 l ;
- 检查输入的命令是完整命令还是别名,并将其替换成原始的命令名称;
(比如 alias rm=‘rm -i’; 给rm -i命令起别名rm,删除东西时提醒输入Y/N 防止用户误删!这些机制与上面命令处理流程不冲突!)
- 进一步检查原始的命令是内部命令(程序)还是外部命令(程序);
(type+命令 可以查看是外部还是内部命令)
-
找到这个命令(程序)的位置,并结合对应的选项以某种方式运行这个命令(程序),返回结果;
其实各种命令,本质上也是一个个独立的程序:
内部命令(程序),随着shell进程的初始创建一同存入了内存中,相当于shell进程中的一些函数,直接运行,不需要文件系统IO进内存,也不受环境变量影响,因此执行效率比较高!
ls cd等都是内部命令; vim cat等都是外部命令
外部命令(程序),存在某些PATH环境变量路径中,需要shell去一个路径一个路径的找这个程序,并通过文件系统inode节点等IO进内存,通过shell fork出子进程进行exec程序替换运行,之后shell还要回收,因此执行效率慢;
(创建子进程,进行exec进程替换的原因是为了shell的安全性,万一非法的第三方外部命令是黑客设计的,不能让他影响到shell解释器)
如果键入的命令既不是内部命令,外部的PATH路径也没有,就显示一条command not found的提示信息;;