CLI 命令行实用程序开发基础
代码传送门,GoOnline平台
1. 概述
CLI(Command Line Interface)实用程序是Linux下应用开发的基础。正确的编写命令行程序让应用与操作系统融为一体,通过shell或script使得应用获得最大的灵活性与开发效率。Linux提供了cat、ls、copy等命令与操作系统交互;go语言提供一组实用程序完成从编码、编译、库管理、产品发布全过程支持;容器服务如docker、k8s提供了大量实用程序支撑云服务的开发、部署、监控、访问等管理任务;git、npm等都是大家比较熟悉的工具。尽管操作系统与应用系统服务可视化、图形化,但在开发领域,CLI在编程、调试、运维、管理中提供了图形化程序不可替代的灵活性与效率。
2. 基础知识
3. 实验过程
(1)首先开发命令行程序避免不了需要解析命令行参数,所以需要下载pflag包(CentOS中使用go get github.com/spf13/pflag
)以满足 Unix 命令行规范。因为pflag不提供-flagValue
的参数值绑定方法,所以没有严格按照-sNumber、-eNumber的形式设计参数,而是沿用了flag的-flag value
、-flag= value
和-flag
的绑定方法。
(2)了解flag使用方法,使用在pflag.xxxVarP()
函数可以将参数的值绑定到相应变量,通过对相应变量和参数检查,以保证命令合法。
必须含有-sNumber和-eNumber参数,所有参数值不能超过int最大值,需要打开的文件必须存在,必须能够正常读写。
(3)使用io库的WriteCloser
和ReadCloser
进行对文件的读写。决定是从文件读取输入还是从键盘读取输入;决定输出到设备还是显示屏。
若没有重定向和管道(pflag.NArg()==1
),默认是标准输入输出,若输入有重定向,则从flag接收到的inputFileName
将为空,所以让ReadCloser=os.Stdin
,从重定向的输入获得输入文件。
若输出没有重定向,将使用-d的参数值
,把结果输出到指定文件(cmd.Stdout
指向该文件),若文件不存在将创建,否则覆盖写入,或者直接输出到标准输出;若输出有重定向,则-d的参数值
将为空,所以让WriteCloser=os.Stdout
,从重定向的输出获得文件。
(4) 进行文件读写,将从ReadCloser读取到的内容写入到WriteCloser。使用func NewReader(rd io.Reader) *Reader
获得到*bufio.Reader
,用于驳接ReadCloser,从文件中按某种方法读取内容,例如ReadLine()、ReadString()
,按照页内行类型,若有-f
参数,则使用ReadLine(‘\n’)
函数读取每一行直到EOF。
4. 实验测试
$ selpg -s1 -e1 input_file
$ selpg -s1 -e1 < input_file
$ other_command | selpg -s10 -e20
$ selpg -s10 -e20 input_file >output_file
$ selpg -s10 -e20 input_file 2>error_file
$ selpg -s10 -e20 input_file >output_file 2>error_file
$ selpg -s10 -e20 input_file >output_file 2>/dev/null
$ selpg -s10 -e20 input_file >/dev/null
$ selpg -s10 -e20 input_file | other_command
$ selpg -s10 -e20 input_file 2>error_file | other_command
$ selpg -s10 -e20 -l66 input_file
$ selpg -s10 -e20 -f input_file
$ selpg -s10 -e20 -dlp1 input_file
该命令未测试,因为没有准备打印机响应该命令,同时为-d
参数绑定的参数值是输出文件路径,无法作为命令执行。
来源:https://blog.csdn.net/wangzh297/article/details/101374468