shell 命令执行

当我们在Bash的交互环境下输入命令时,Bash是如何执行我们输入的各种命令的呢?

zhaixue@ubuntu:~$ time

real    0m0.000s
user    0m0.000s
sys    0m0.000s
zhaixue@ubuntu:~$ ls
cscope.out  Documents  Music     Public     Videos
Desktop     Downloads  Pictures  Templates  vmware-tools-distrib
zhaixue@ubuntu:~$ ps
    PID TTY          TIME CMD
   3016 pts/0    00:00:00 bash
   3181 pts/0    00:00:00 ps

我们在bash交互环境下输入的命令,bash会新建一个子进程,然后各个命令以子进程的形式运行,运行结束后,子进程退出,重新回到shell当前的进程,等待用户输入新的命令执行,周而复始。

shell在读取用户输入的命令时,首先会把用户输入的一行命令字符串分解成一个个单词和运算符,并使用引用规则对这些单词进行解析,把这些单词解析成命令、变量或其他结构,执行这些命令,等待其退出的状态,并根据这个状态来决定后续的执行或处理操作。

shell中的注释符是#,shell在解析命令时,遇到#,会将注释的这一整行都忽略掉,不再进行解析。

命令被拆分成单词后,就会得到一个一个的简单命令,及其可选的参数列表。shell会根据这个命令名,去搜索这个命令,搜索到了才会去执行它,搜索的顺序如下:

  • 看看是不是有同名的函数
  • shell内部的命令
  • 文件系统PATH路径下的可执行二进制文件

命令的退出状态

在Linux或UNIX世界中,如果命令运行正确,不会给任何提示,一切都是安静的,说明一切都是正确的。只有错误和异常发生,才会有警告或错误的信息出来。当一个命令运行结束后,它的退出状态就是当前shell使用waitpid观察其子进程的返回值。命令正确执行,返回值为0,命令执行错误,返回值是1~255中间的某一个,不同的返回值代表不同的错误,可以使用perror来解析每个错误码对应的具体错误信息。

《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客