Linux命令分为两类,具体为内部命令和外部命令
内部命令: 指shell内部集成的命令,此类命令无需人为安装,开机后自动运行在内存中,命令help查看所有内部命令的详情,如cd、type、echo、time、true等。
外部命令: 指通过外部介质安装的命令工具包,如通过yum、rpm等方式安装,具体安装路径在$PATH下。
命令查看: type查看命令分类,内部命令显示 shell相关信息,外部命令则显示$PATH路径
命令形态主要分为4类:alias别名命令、内部命令、hash缓存命令和外部命令。
实例:echo即是内部命令又是外部命令,以echo为例实验证明其执行顺序
1.将/bin/echo 复制到/usr/local/bin/下,用which -a查看echo的路径($PATH中/usr/local/bin路径优先于/bin,则echo优先使用/usr/local/bin/下的echo)
2.查看内部echo,并关闭内部命令的echo,使用echo命令在hash中形成记录,并查看记录
3.删除/usr/local/bin下的echo,hash中任然存echo的路径/usr/local/bin,再次使用echo “welcome to xi’an” 结论:执行hash中的命令优先$PATH中的命令
4.开启内部命令echo,再次执行echo “welcome to xi’an” 结论:说明内部命令优先于hash缓存命令和外部命令
5.定义别名alias echo=“hostname”,如果echo 输出是hostname的内容时,则表明alias比内部命令优先 总结:命令执行顺序为alias——内部命令——hash缓存——外部命令
1.type command 查看是否是内部命令
2.which -a| –skip-alias command 查看所有包含command的路径|不查看别名的路径
3.enable -n command 关闭内部命令
4.hash -l 显示hash缓存 -d 清楚具体缓存命令路径 -r 删除所有命令路径
5.alias 定义别名 ualias取消别名
ls命令执行过程:
下面进行简单分析: 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在得到成功退出码后,继续等待用户输入。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。