golang执行命令行(go执行命令行)

发布网友 发布时间:2024-09-27 18:11

我来回答

1个回答

热心网友 时间:2024-09-28 00:47

Golang之实用的命令行工具包cobra

Cobra是一个非常实用(流行滚掘)的golang包,很多优秀的开源应用都在使用它,包括Docker和Kubernetes等,它提供含销了简单大老核的接口来创建命令行程序。同时,Cobra也是一个应用程序,用来生成应用框架,从而开发以Cobra为基础的应用。

golang调用外部命令,并且通过stdin传数据

golang调用外部命令,并且通过stdin传数据的例子

使用场景:

当我们需要调用一个外散明部命令,然后给外部冲帆告命令传参数,常用方便的轿竖做法是通过命令行传参数,但是有些时候数据太长,或者基于安全考虑,比如传密码,等不方便使用参数时,我们可以通过stdin传递。

下面一个dockerlogin传递密码的例子:

当然这都需要外部命令本身支持从stdin读入数据哈。

golang执行系统命令psaux|grep"xxxx",总是异常退出

你这个是老运团两个命令,不是一个命令。

grep是查找命令,你应该:

exec.Command("悄或ps","aux").Output()

出结果后再过虑。侍橘

golang命令行库Cobra的使用

写了2次才写完,内容很长,翻译了很久,内容来源于Cobragithub介绍。翻译完也更全面的了解了Cobra,功能相当强大完善,各种使用的场景都考虑到了。另外宏此也扩展了一些其它知识,比如命令行玩法,Levenshteindistance等等。以下是正文:

Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具。Cobra同时也是一个程序,用于创建CLI程序

Cobra是建立在结构的命令、参数和标志之上。

命令代表操作,参数和标志是这些行动的修饰符。

最好的应用程序就像读取句子。用户会知道如何使用本机应用程序,因为他们将理解如何使用它。

比如下面的例子,server是命令,port是标志:

在下面的命令,我们告诉Git克隆url地址bare

使用Cobra很简单。首先,使用goget安装最新版本

然后在你项目里引用Cobra

通常基于Cobra的应用程序将遵循下面的组织结构,当然你也可以遵循自己的接口:

在Cobra应用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

Cobra提供自己的程序来创建你的程序并且添加你想要的命令。这是最简单的方式把Cobra添加到你的程序里。

这里你能找到相关信息

使用Cobra,需要创建一个空的main.go文件和一个rootCmd文件。你可以选择在合适的地方添加额外的命令。

Cobra不需要特殊的构造函数。简单的就可以创建你的命令。

理想情况下你把这个放在在app/cmd/root.go

你会另外定义标志和处理配置init()函数。

比如cmd/root.go

你需要在main函数里执行root命令。

通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

其它的命令通常定义在cmd/目录下的自己文件内

如果你想创建一个version命令,你可以创建cmd/version.go文件,并在文件里这么写:

标志提供修饰符控制动作命令如何操作

当标志定义好了,我们需要定义一个变量来关联标志

'持久'表示每个在那个命令下的命令都将能分配姿绝漏到这个标志。对于全局标志,'持久'的标志绑定在root上。

Cobra默认只在目标命令上解析标志,父命令忽略任何局部标志。通过打开Command.TraverseChildrenCobra将会在执行任意目标命令前解析标志

你同样可以通过viper绑定标志:

在这个例子中,永久的标记author被viper绑定,注意,当用户没有给--author提供值,author不会被赋值。

标记默认是可选的,如果你希望当一个标记没有设置时,命令行报错,你可以标记它为必须的

验证位置参数可以通过Command的Args字段。

内置下列验证方法

一个设置自定义验证的例子

在下面迹烂的例子,我们定义了3个命令。2个在顶级,一个(cmdTimes)是其中一个顶级命令的子命令。在这个例子里,由于没有给rootCmd提供Run,单独的root是不能运行的,必须要有子命令。

我们仅为一个命令定义了标记。

更多关于flags的文档可以在找到

更完整大型程序的例子,可以查看Hugo.

当你的程序有子命令时,Cobra会自动给你程序添加help命令。当你运行‘apphelp’,会调用help命令。另外,help同样支持其它输入命令。例如,你有一个没有任何其它配置的命令叫‘create’,当你调用‘apphelpcreate’Corbra将会起作用。

下面的输入是Cobra自动生成的。除了命令和标志的定义,其它不再需要。

help就跟其它命令一样,并没有特殊的逻辑或行为。事实上,你也可以提供你自己help如果你想的话。

你能为默认的命令,提供你自己的help命令或模板。使用下面的方法:

后2个也将适用于任何子命令

当用户提供无效的标记或命令,Cobra将会返回用法。

你可能从上面的帮助意识到,默认的帮助将被嵌入到用法里然后作为输出。

你能提供你自己的用法函数或模板给Cobra使用。

比如帮助,方法和模板都可以重写。

如果Version字段设置到了根命令,Cobra会提供了一个顶层‘--version’标记。运行带上‘--version’标记的程序,将会按照模板版本信息。模板可以通过cmd.SetVersionTemplate(sstring)方法修改

在命令运行前或运行后,再运行方法非常容易。PersistentPreRun和PreRun方法将会在Run之前执行。PersistentPostRun和PostRun方法将会在Run之后执行。Persistent*Run方法会被子命令继承,如果它们自己没有定义的话。这些方法将按照下面的属性执行:

下面的例子,2个命令都使用了上面的特性。当子命令执行的时候,它将执行根命令的PersistentPreRun,但不会执行根命令的PersistentPostRun:

输出:

Cobra会自动输出建议,当遇到“unknowncommand”错误时。这使得当输入错误时,Cobra的行为类似git命令。例如:

建议会基于注册的子命令自动生成。使用了Levenshteindistance的实现。每一个注册的命令会匹配2个距离(忽略大小写)来提供建议。

如果你希望在你的命令里,禁用建议或虚弱字符串的距离,使用:

你可以通过SuggestFor来给命令提供明确的名词建议。这个特性允许当字符串不相近,但是意思与你的命令相近,别切你也不想给该命令设置别名。比如:

Cobra可以基于子命令,标记,等生成文档。以以下格式:

Cobra可以生成一个bash-completion文件。如果你给命令添加更多信息,这些completions可以非常强大和灵活。更多介绍在BashCompletions。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com