使用go语言开发selpg

selpg介绍

这是一个什么东西,引用网上的介绍,结合官网的介绍:
selpg 是从文本输入选择页范围的实用程序。该输入可以来自作为最后一个命令行参数指定的文件,在没有给出文件名参数时也可以来自标准输入。selpg首先处理所有的命令行参数。在扫描了所有的选项参数(也就是那些以连字符为前缀的参数)后,如果selpg发现还有一个参数,则它会接受该参数为输入文件的名称并尝试打开它以进行读取。如果没有其它参数,则 selpg 假定输入来自标准输入。

go语言开发过程

输入参数设计:

需要考虑的参数包括:

  • 开始页数(startPage)
  • 结束页数(endPage)
  • 输入来源(infile):这里有两个选择,包括标准输入和文本读取
  • 输出:包括标准输出或者重定向到文件
  • 读取类型(pageType):是按页读取还是按行读取
  • 每一页包括多少行(pageLength)
参数获取

这里使用的是pflag包,其实使用的时候和flag包没有很大区别

flag.IntVar(&args.startPage, "s", -1, "Start page.")
flag.IntVar(&args.endPage, "e", -1, "End page.")
flag.IntVar(&args.pageLength, "l", 72, "Line number per page.")
flag.BoolVar(&args.pageType, "f", false, "Determine form-feed-delimited")
flag.StringVar(&args.fileDest, "d", "", "specify the printer")
flag.Parse()
输入错误判断

这里要考虑的内容又很多,包括输入时开始页数的取值范围,结束页数的取值范围,读取文件时是否出现错误,输出文件时是否发生错误等等。这里的错误判断我放在每一步中进行,并没有封装到一个函数中,因为我觉得每一种错误都需要一个错误信息。

判断输入位置和输出位置

这里我先判断输出位置在哪里,是输出到屏幕还是重定向到文件中,如果是输出到屏幕,直接调用

fmt.Println()

函数即可,但如果是重定向到文件中,则需要使用管道将输入写到文件中,在go语言中:

cmd = exec.Command("cat", "-n")
stdin, err = cmd.StdinPipe()

首先exec.Command函数返回一个*Cmd,用于使用给出的参数执行“cat”指定的程序,而cmd.StdinPipe会创建一个管道将输入写到文件中去。同时,这里还涉及到-d命令,当调用

cmd.Run()

函数时,由于我们虚拟机没有连接打印机,这里会返回一个错误。同时由于cat命令,我们可以看到打印的内容。
对于输入位置,可以通过判断infile是否为空,来判断是否应该读取文件。

关于-dXXX命令

selpg 还允许用户使用“-dDestination”选项将选定的页直接发送至打印机。这里,“Destination”应该是 lp 命令“-d”选项(请参阅“man lp”)可接受的打印目的地名称。该目的地应该存在 ― selpg 不检查这一点。在运行了带“-d”选项的 selpg 命令后,若要验证该选项是否已生效,请运行命令“lpstat -t”。该命令应该显示添加到“Destination”打印队列的一项打印作业。如果当前有打印机连接至该目的地并且是启用的,则打印机应打印该输出。这一特性是用 popen() 系统调用实现的,该系统调用允许一个进程打开到另一个进程的管道,将管道用于输出或输入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellowangld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值