从零实现一个shell解释器

shell初体验

在Linux环境下工作,我们经常去打开一个Terminal终端,然后在终端下敲入shell命令和运行,如:

我们也可以编写一个简单的脚本文件并运行它

爱好思考的同学可能就会有疑问了:

  • 为什么我们在终端下敲入命令,就可以直接运行?
  • 为什么我们在终端下可以直接运行一个脚本?
  • 这个脚本是如何运行的?
  • shell中的管道命令是如何实现的?
  • shell到底是个什么东西?

揭开shell神秘的面纱

在各种书籍和文档资料中,我们经常会看到如下一张图来描述shell和操作系统之间的关系

shell相当于是一个中介:介于用户和操作系统之间。我们在Linux环境下想运行一个应用程序,一般有2种方法:

在图形用户界面下,点击桌面图标或菜单,启动一个应用程序
shell交互环境下,输入一个shell命令或脚本文件,来启动一个应用程序
shell到底是什么东东呢?我们打开一个虚拟Terminal终端,输入 # ps -a

此时你会看到有一个叫做bash的进程,这个bash其实就是我们的shell,当我们在图形模式下打开一个Terminal或者使用Ctrl+Alt+F3快捷键去登录一个终端时,一般都会启动一个shell解释器,用来解释和执行用户输入的命令,如ls命令。常见的shell解释器有bash、sh、csh等,这些shell解释器以一个用户态进程的形式在运行,通过交互窗口,解析用户输入的shell命令,然后fork一个子进程去执行它。

除了解析和执行用户的输入命令外,shell解释器还支持更多复杂的功能,如:脚本的执行、管道命令、输入输出重定向、前后台执行、支持环境变量等。

从零实现一个shell解释器

除了官方常用的bash、sh等shell解释器,我们也可以自己实现一个shell解释器!《Linux系统编程》视频教程第06期:从零实现一个shell解释器已发布。在本期视频教程中,将会带领大家,从零开始,一步一步实现一个简单的shell解释器:wsh。主要实现了shell的如下功能:

  • 实现了shell常用的内建命令:cd、exit
  • 支持对信号的处理操作
  • 支持命令的后台运行
  • 实现了shell的管道命令
  • 支持脚本的解析和运行
  • 实现了脚本语法if-else流程控制
  • 支持shell环境变量及export命令

麻雀虽小五脏俱全,区区600+行代码,我们就可以模仿实现shell的大部分基本功能,当然,跟实际的bash十万余行的代码量相比,这还只是一个demo,等待你的继续完善。但是通过自己从零开始,一步一步地实现,可以深刻理解shell命令运行时,底层的各种机制和细节,对我们理解Linux系统、熟悉掌握Linux系统编程有很大的帮助。目前课程教程已经发布到淘宝平台:编程实战:从零实现一个SHELL解释器

一线原厂驱动开发经验,专门为嵌入式精心打造的嵌入式进阶视频教程,详情请点击:王利涛老师个人店