关于程序员:golang实现一个linux命令ls命令命令行工具构建

4次阅读

共计 2074 个字符,预计需要花费 6 分钟才能阅读完成。

心愿 2023 能够听到这些话:

  • 祝贺你失去了这份工作
  • 祝贺你的倡议被采纳了
  • 祝贺你被录取了
  • 祝贺你的考试顺利通过了
  • 祝贺你上岸了
  • 祝贺你升职了
  • 祝贺你加薪了
  • 祝贺你体检后果一切正常

在这篇文章上面许个愿吧!

ls 命令

要实现 ls,首先先咱们温习一下ls 命令。

  • ls不加任何参数,示意查问当前目录下的文件 / 文件夹
  • ls前面加上门路,列出所有,不蕴含暗藏文件 / 文件夹
  • ls -a列出所有,包含以 . 结尾的暗藏文件

此命令还有很多性能,这一节的重点是命令行水平的编写,就实现下面四个。

os.Args 读取参数

定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序自身,前面为参数列表。

var Args []string

比方ls -lArgs=["ls","-l"],咱们当初实现ls+ 目录,或者缺省目录时默认当前目录代码如下。

func main() {
    targetDirPath := "./"
    if len(os.Args) > 1 {targetDirPath = os.Args[1]
    }

    if dirList, err := ioutil.ReadDir(targetDirPath); err == nil {
        for _, dirInfo := range dirList {fmt.Print(dirInfo.Name() + " ")
        }
    } else {fmt.Println(err.Error())
    }
}
  • 应用 os.Agrs 来获取传入程序的参数
  • 应用 ioutil.ReadDir 读取目录, 将返回值 [] FileInfo 遍历, 输入目录 / 文件信息
  • 将遇到的 error 输入到 终端

输入

$ go build -o ls main.go
$ ./ls 
main.go folder ls
$ ./ls folder
file1 file2

看,咱们曾经简略的实现了。但咱们会发现,要应用 - 结尾的参数时,用 os.Args 这个还须要手写更多简单逻辑去判断输出的到底是门路,还是其余参数,于是下一个包退场了。

pflag

昨天的每日一 Go 曾经讲了 flag 包,pflag 包与 flag 包的工作原理甚至是代码实现都是相似的,上面是 pflag 绝对 flag 的一些劣势:

  • 反对更加精密的参数类型:例如,flag 只反对 uintuint64,而 pflag 额定反对 uint8uint16int32 等类型。
  • 反对更多参数类型:ipip maskip netcount、以及所有类型的 slice 类型。
  • 兼容规范 flag 库的 FlagFlagSetpflag 更像是对 flag 的扩大。
  • 原生反对更丰盛的性能:反对 shorthanddeprecatedhidden 等高级性能。
var a = pflag.BoolP("all", "a", false, "Include directory entries whose names begin with a dot (.).")
    var help = pflag.BoolP("help", "h", false, "Show this help message.")
    pflag.Parse()
    if *help {pflag.Usage()
        return
    }
    args := pflag.Args()
    if len(args) == 0 {args = append(args, "./")
    }
    if len(args) == 1 {ShowPath(args[0], *a)
    } else {
        for _, v := range args {fmt.Println(v + ":")
            ShowPath(v, *a)
        }
    }
  • 列出文件夹的形式写到了 ShowPath 函数里,第二参数是一个 bool 判断是否列出全副文件(包含暗藏文件)感兴趣去看我源代码,这里不是重点。
  • pflag.BoolP 定义一个 bool 类型的参数,反对长短参数模式--all,-a,返回值是指针。
  • pflag.Parse() 调用这个函数,把参数值设置到相应指针的指向里。
  • pflag.Usage() 用法打印。

这样咱们就实现了 ls 的基本功能。测试一下。

$ go build -o ls main.go
$ ./ls
folder go.mod go.sum main.go 
$ ./ls -a
. .. .git folder go.mod go.sum main.go 
$ ./ls ./ folder 
./:
folder go.mod go.sum main.go 
folder:
file1 file2
$ ./ls -h
Usage of ./ls:
  -a, --all    Include directory entries whose names begin with a dot (.).
  -h, --help   Show this help message.

是不是相当给力啦!

小结

命令行读取一共有五个罕用的包

  • os.Args 零碎包提供的参数解析。
  • flag:简略参数解析,昨天的每日一 Go 分享过。
  • pflag:命令行参数解析。
  • cobra:利用命令行框架,改天再分享。
  • viper:配置文件、环境变量、命令行、缓冲区。明天群里的每日一 Go 曾经分享了,就不多说了。

命令行工具,你只有赋予可执行权限,再放到 bin 外面,他就会成为一个系统命令,不便你做更多的事件,比方备份数据库之类的动作,进步你的运维效率。

援用

  • 命令行工具
  • 极客工夫

本文由 mdnice 多平台公布

正文完
 0