【Linux】【命令】【解析原理】

0. 引言
本人才疏学浅,介绍的内容都是浅尝辄止,给出大致的使用方法和适用场景,深入的研究作者和读者还都需要下大功夫,如果我的分享恰好给正遇到难题的你一个排查的方向,那么这篇文章也是有意义的。

1. shell
shell是一个linux系统的一个壳,也可以理解为一个简单的桌面应用,接收用户输入的字符串,仅仅只有接受字符串的作用。解析的工作都是交由内部的核来完成的。

内部的核有几种,bash、ksh、csh,我只接触过bash,下面也都以bash举例。Bash后面会有专门的文章来介绍,我们先说一下linux命令解析原理。

2. Linux命令分为内部命令和外部命令
a) 内部命令:
是shell程序的一部分,包含一些简单的linux系统命令,由shell程序识别并在shell程序内部完成运行,在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bash源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。例如:cd history等
b) 外部命令:
是一些功能强大的实用程序,由于功能强大,其包含的代码量很大,系统加载时并不随系统一起被加载到内存中,在需要时才将其调用内存。外部命令的实体并不包含在shell中,但是其由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin…等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。

3. 区分外部命令和内部命令的方法
a) Type
通过type命令可以确定命令是外部命令还是内部命令
例如:type ifconfig【Linux】【命令】【解析原理】
可以看到ifconfig存在于/sbin/目录下,属于linux加载进来的外部命令

例如:type cd
【Linux】【命令】【解析原理】
我们发现cd是一个shell buildin,这是一个linux shell自带的内部命令
b) File
通过file命令我们可以确认命令文件的格式。

内部命令不存在文件,此处我们针对外部命令

/sbin/ifconfig
File /sbin/ifconfig
【Linux】【命令】【解析原理】
可以看到ifconfig是一个二进制可执行文件

File /usr/bin/pip3
【Linux】【命令】【解析原理】
我们发现结果是Python scripts,实际pip3文件是文本文件,而脚本解析工作都是由#/usr/bin/python这个二进制文件进行解析,随后转换成CPU能够执行的指令完成操作的。

4. 查询命令的使用方法
a) 内部命令
对于内部命令而言,bash自带了help命令作为帮助手册,当然help命令也是内部命令

用法:help cd,提示中会给出详细的用法【Linux】【命令】【解析原理】
b) 外部命令
外部命令使用man命令查找使用方法,man也是一个外部命令,需要手工安装,不同的操作系统安装的方法不同

使用方法:man ifconfig,参数和实例都会显示出来。【Linux】【命令】【解析原理】
5. 定位命令的位置
通过whereis ifconfig来定位ifconfig命令的位置

  1. Shell解析命令的原理
    a) Shell接收用户输入的字符串,以空格作为分隔
    b) 第一个空格前的字符串作为命令,随后在系统中查找命令
    c) 首先查找内部命令,如果内部命令查找不到则在$PATH环境变量中查找外部命令
    d) 如果查到则继续解析其余参数
    e) 如果查不到,直接提示commond not found