Linux命令执行过程

时间:2023-03-09 01:55:01
Linux命令执行过程

一.命令分类

Linux命令分为两类,具体为内部命令和外部命令

内部命令:

指shell内部集成的命令,此类命令无需人为安装,开机后自动运行在内存中,命令help查看所有内部命令的详情,如cd、type、echo、time、true等。

外部命令:

指通过外部介质安装的命令工具包,如通过yum、rpm等方式安装,具体安装路径在$PATH下。

命令查看:

type查看命令分类,内部命令显示 shell相关信息,外部命令则显示$PATH路径

Linux命令执行过程

二.命令执行顺序

命令形态主要分为4类:alias别名命令、内部命令、hash缓存命令和外部命令。

实例:echo即是内部命令又是外部命令,以echo为例实验证明其执行顺序

1.将/bin/echo 复制到/usr/local/bin/下,用which -a查看echo的路径($PATH中/usr/local/bin路径优先于/bin,则echo优先使用/usr/local/bin/下的echo)

Linux命令执行过程

2.查看内部echo,并关闭内部命令的echo,使用echo命令在hash中形成记录,并查看记录

Linux命令执行过程

3.删除/usr/local/bin下的echo,hash中任然存echo的路径/usr/local/bin,再次使用echo “welcome to xi'an”

结论:执行hash中的命令优先$PATH中的命令

Linux命令执行过程

4.开启内部命令echo,再次执行echo “welcome to xi'an”

结论:说明内部命令优先于hash缓存命令和外部命令

Linux命令执行过程

5.定义别名alias echo=“hostname”,如果echo 输出是hostname的内容时,则表明alias比内部命令优先

总结:命令执行顺序为alias——内部命令——hash缓存——外部命令

Linux命令执行过程

三.命令分类及查找基本命令

1.type command 查看是否是内部命令

2.which -a| --skip-alias command 查看所有包含command的路径|不查看别名的路径

3.enable -n command 关闭内部命令

4.hash -l 显示hash缓存 -d 清楚具体缓存命令路径 -r 删除所有命令路径

5.alias 定义别名 ualias取消别名

四.命令执行过程

ls命令执行过程:

Linux命令执行过程

下面进行简单分析:

1、shell不断询问是否有键盘输入,用户以enter结束键盘输入后,shell程序以空格为分隔符,得到"ls","-l","*.c",三个字符串。

2、shell发现第三个字符串包含"*"通配符,就会在当前路径(或指定路径)下搜索满足这个通配符的文件。有bar.c和foo.c两个文件,然后展开成{"ls","-l","bar.c","foo.c"}四个字符串,并保存在argv这个二维字符数组中,并赋值argc为4。

3、shell然后会 alias——内部命令——hash缓存——外部命令,寻找一个叫"ls"的命令。如果存在,则fork()一个子进程,调用exec()加载运行ls命令。ls的main(int argc, string ** argv)函数的参数就是从shell那里得来的。若不存在就会提示用户"command not found"。

4、ls程序执行后,会分析argc和argv,"-l"表示这是一个选项开关,表明用户想得到文件的详细信息,并把这个开关量保存,以便最后输出的时候选择信息的格式。

5、ls执行完既定的步骤后,退出并返回退出码,若成功则返回0,否则根据错误的不同返回不同的非零数字。

6、shell在得到成功退出码后,继续等待用户输入。