CLI 命令行实用程序开发基础
参考网站:开发简单CLI程序
概述
CLI(Command Line Interface,命令行界面)实用程序是Linux下应用开发的基础。正确的编写命令行程序让应用与操作系统融为一体,通过shell或script使得应用获得最大的灵活性与开发效率。例如:
- Linux提供了cat、ls、copy等命令与操作系统交互;
- go语言提供一组实用程序完成从编码、编译、库管理、产品发布全过程支持;
- 容器服务如docker、k8s提供了大量实用程序支撑云服务的开发、部署、监控、访问等管理任务;
- git、npm等也是大家比较熟悉的工具。
尽管操作系统与应用系统服务可视化、图形化,但在开发领域,CLI在编程、调试、运维、管理中提供了图形化程序不可替代的灵活性与效率。
我们平时在Linux终端输入的ls,cd,mkdir等命令,就是CLI,命令行程序,我们需要做的便是按照上面那个链接的要求,用go实现名称为selpg的命令行工具
在阅读源码之前,先举一些简单的例子
比如我们应该如何正确处理ls -a呢
每种后端语言都有识别输入参数的接口,“ls”和“-a”就对应两个输入参数,获取到它们后,我们解析这些参数,然后实现对应的功能,这就是命令行程序的工作
基础知识
几乎所有语言都提供了完善的 CLI 实用程序支持工具。例如:
c语言的入门文档:开发 Linux 命令行实用程序,Linux命令行程序设计;
python:Using Python to create UNIX command line tools。
我们主要研究c语言的CLI实用程序支持工具:
selpg概念
selpg,即SELect PaGes,是从文本输入选择页范围的实用程序,允许用户指定从输入文本抽取的页的范围,这些输入可以来自作为最后一个命令行参数指定的文件或另一个进程,在没有给出文件名参数等的时候也可以来自标准输入。
selpg会首先处理所有的命令行参数。在扫描了所有的选项参数后,如果selpg发现还有一个参数,则它会接受该参数为输入文件的名称并尝试打开它以进行读取;如果没有其它参数,则selpg假定输入来自标准输入。
selpg是以在Linux中创建命令的事实上的约定为模型创建的,这些约定包括:
- 独立工作;
- 在命令管道中作为组件工作(通过读取标准输入或文件名参数,以及写至标准输出和标准错误);
- 接受修改其行为的命令行选项。
命令行准则
通用 Linux 实用程序的编写者应该在代码中遵守某些准则,这样有助于确保用户以更灵活的方式使用实用程序,特别是在与其它命令(内置的或用户编写的)以及 shell 的协作方面,而这种协作是利用 Linux 作为开发环境的能力的手段之一。
准则1:输入
$ command input_file //在命令行上指定的文件名,读取文件 input_file
$ command //输入为终端(键盘),输入Control-D(文件结束指示符)前的输入都成为其输入
$ command < input_file //shell 操作符“<”(重定向标准输入)也可将标准输入重定向为来自文件
$ other_command | command //操作符“|”(pipe)使other_command 的标准输出(stdout)被 shell/内核透明地传递至 command 的标准输入
准则2:输出
$ command //标准输出,缺省情况下是终端(屏幕),其输出出现在屏幕上
$ command > output_file //shell 操作符“>”(重定向标准输出)可将标准输出重定向至文件
$ command | other_co