如何解决linux进入命令行界面CLI界

20分钟掌握前端编写 CLI 工具
CLI(command-line interface 命令行界面)是指在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。
典型的CLI界面:
GUI(Graphical User Interface 图形用户界面)是指采用图形方式显示的计算机操作用户界面。
典型的GUI界面:
自古软件设计这个武林有两大流派,其中有一个是”CLI“,另外一个是”GUI“。它们一个为了普渡众生,一个为了提高内力,虽然在GUI出现之前,CLI独步武林。但是随着科技的发展,GUI后发致人很快就一统江湖。但是现在谁是天下第一已经不重要了,重点是如何学会用这两种武术提高自己,在合适的情况下用合适的解决方法。下面是我的理解:
作为互联网深度沉迷患者,很多体验是离不开GUI软件的,比如工作邮件,使用foxmail的GUI界面,我可能只需要点几下鼠标敲几下键盘就可以完成一次工作汇报。
但是作为前端资深复制粘贴工程师,也同样离不开CLI工具,在一个项目完成后,我用配置好的自动化软件(比如gulp),我只需要敲一个命令就可以完成上线前的准备。
到这里各位看官应该懂了,
CLI更节省计算机资源,提高生产效率。因为不需要处理图形界面,所以开发成本低。适合面对各种geek向的码农。GUI用户学习成本更低,体验更好,生产效率相对较低。开发成本高。适合面对普通互联网用户。
在这里不得不提一下,之前做的,虽然很厉害,但是启动太慢了加上界面交互浪费了太多精力没有抓住用户的“刚”,所以从效果来说并不是特别好:(
到这里,如果你依旧对前端如何构建一个CLI感兴趣,请跟我一起,10分钟打造一个基于nodejs的CLI工具吧。
在完成一个命令行工具之后,javascript这种浏览器语言,终于完成全产业链(从浏览器到桌面软件再到CMD工具)的试练,成为了武林之巅,也就是世界上最好的语言 :)
配置环境这次我们是基于nodejs来实现一个CLI工具,nodejs环境根据官网的文档一步步说明就好,NPM在公司内部需要配置代理。
首先如需要设全局代理:
set http_proxy= http:
NPM需要设置:
npm config set proxy
初始化项目配置文件 package.json进入开发目录,执行
将会创建 package.json和默认的配置。当然手动创建也没有问题。
具体配置说明
创建和配置主入口文件在package.js文件中,需要新增
"node-cli": "bin/index.js"
其中node-cli是需要执行的命令名,bin/index.js是命令所调用的文件
到此,准备工作已经完成了,接下来我们在index.js文件中写入
console.log('my first cli');
打开命令行工具,进入当前当前开发文件夹,输入
bin/index.js
则会输出my first cli 。
但是这样有些麻烦,我们如何像发布后一样,直接输node-cli命令就可以调用我们的主文件呢?
我们需要在开发目录执行
就可在目前的全局环境中创建node-cli命令,成功以后,你就可以在本机任何目录执行node-cli。
一些包推荐
在开发命令行过程中,我们会碰到各种问题,比如fs模块的pomise化、用户命令的复杂交互、友好的版本升级提示等等。利用npm当中的成熟库会是一个好方法,推荐几个库.
通用CLI构建
看了这么多,也许有点迷糊?基于上面的步骤,有一个通用的CLI项目目录,集成了几个推荐的包,在clone之后迅速开始一个CLI工具的构建:
前一段时间做了一个TG-CLI工具,大家在实现自己的CLI工具时,可拿来参考。
主要用来搭建互娱网站系统内的PC和移动专题,并根据用户输入配置页面内的基本元素,如注释、SEO信息、上报代码,并根据配置自动配置gulp,实现自动压缩、分离、补全SEO信息等。
主要有这些功能:
用户自主配置参数生成规范化目录结构自动生成配置文件命令包装版本检查…使用预览:
在实际编写过一个CLI工具之后,我觉得除了让电脑爆炸的功能以外,什么都能实现 :)
大家多多交流:)
Node.js编写CLI的实践
CLI 语言一览表
Nodejs-cli 填坑记
前端应该掌握的linux命令和工具
实例解析C++/CLI之开篇
Linux 下常用的 CLI 软件
开发人员常说的CLI是什么
vue-cli是什么?
CLI (命令行接口) 简易开发
Commons CLI使用详解
没有更多推荐了,go如何编写命令行(cli)程序 - 简书
go如何编写命令行(cli)程序
创建一个命令行程序
如何使用golang创建可以在命令行当中传递参数的程序?go如何带参数执行程序?
比如我们期望使用hello -version来查看hello程序的版本号码。或者输入hello language chinese 来切换hello程序的语言版本。
在网络上大家可以经常搜索到的解决方案是使用go标准库当中的os.Args或者flag方法获取命令行参数再执行程序。可以很容易google和baidu的这里就不重复说明了。
这里介绍一个开源的cli库的解决方案。
该cli库集成了很多创建cli程序的工具和方法,官方github库文档功能案例介绍比较全面很容易学习使用。
截止到日,该开源库有875次commit,33次releases,7462个star。经过长期迭代和社区验证功能比较完整,程序稳定性也相对会可靠很多。
实现查看版本和切换语言的程序功能
注:本案例代码只是简单的打印出language而已。
package main
"github.com/urfave/cli"
func main() {
//实例化cli
app := cli.NewApp()
//Name可以设定应用的名字
app.Name = "hello"
// Version可以设定应用的版本号
app.Version = "1.0.0"
// Commands用于创建命令
app.Commands = []cli.Command{
// 命令的名字
"language",
// 命令的缩写,就是不输入language只输入lang也可以调用命令
Aliases: []string{"lang"},
// 命令的用法注释,这里会在输入 程序名 -help的时候显示命令的使用方法
"change language",
// 命令的处理函数
func(c *cli.Context) error {
language := c.Args().First()
if language == "chinese"{
fmt.Println("Language is 中文")
fmt.Println("Language is English")
return nil
// 接受os.Args启动程序
app.Run(os.Args)
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -help
hello - A new cli application
hello [global options] command [command options] [arguments...]
language, lang
change language
Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h
--version, -v
print the version
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -version
hello version 1.0.0
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang chinese
Language is 中文
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang french
Language is English
liuyMacBook-Pro:gowork liuyunpeng$ go run hello.go lang english
Language is English
更多的使用方法可以登录查看。
1.命令行的形式
值得大家注意的是,-flag 前面带减号(实际上应该是破折号为了方便就缩减成减号了)这种带标志方式的使用方法和 command 方法是两个概念。个人理解是前者代表参数的传递比如给 -name=ppmoon 就是给name变量传递ppmoon参数。后者是执行一段命令,比如 hello add 1 1 返回结果就是2,就是通过hello程序执行了一个1+1的运算,参数通过空格的方式依次传递到程序当中了。从使用体验和角度来说个人认为并没有什么大的区别,因为本质上来说cli程序只是没有图形化的UI界面,我们只是在命令提示符当中操作程序罢了,不管你使用什么样子的方式传递都只是形式上的变化。
2.关于go标准库当中的flag包以及os.Args方法
flag是官方提供的一个不错的cli程序扩展包,里面也包含了很多常用的方法。不管是flag还是urfave/cli都需要依赖OS包当中的os.Args方法来获取命令行参数,这一点是值得注意的便于理解cli程序的原理。
3.设置环境变量在任意文件夹使用cli程序
在Mac Windows Linux我们都会使用到命令行程序,如果想在全局任何一个文件夹下面都使用命令行程序,我们只需要将cli程序的可执行程序文件所在的文件夹路径添加到环境变量里就可以直接使用程序的名字全局调用cli程序了。具体网络上可以搜索到诸多教程这里就不赘述了。
pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public、private、protected, 以及不写(默认)时的区别(201...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
《失宠王妃之结缘》倒计时—1天!高云翔形象诠释史上最腹黑帝王 《失宠王妃之结缘》这部剧“日将在爱奇艺”独家播放,由北京卓匠文化传媒有限公司网络宣传发行,等了这么久终于在网络平台播出了, 二月八日期待ing! 倒计时!——1天! “义渠君”高云翔颠覆形象诠释史...
不知道在哪里看到的研究报告显示周六是中国人最爱笑、也是最快乐的一天,我当然也不例外。 早晨的哀乐 然而这个周六的早晨却是在一片哀乐声中开始的,大概不到六点,此起彼伏的哀乐不停的响起,从小到大、从远及近,直到把我完全清醒。偶尔听到哀乐也属于正常,这个世间总会有人死去。我联想到...
我仿佛椅坐在缓缓变换景色的列车内,任由它们从眼前游走,你抓不住它们,不是无动于衷,而是觊觎伸手。 我想我是孤独的,但我身边却又不总是孤独。所以我可能想对你们说抱歉。我笑笑,我可能缺了什么东西? 我想到淳朴古镇,翠色欲流的草原上踱步,跟一个人说悄悄话,说不分开的话。 那个人一...
一. 课上代码 二. 测试题 请问这个函数有多少个参数? 如果回答是两个或者四个,那是不对的,因为类似于这样的写法是错误的。因为函数的参数需要的是变量,而这里使用元组的形式来传递是不行的,具体应该这样写: 三. 动动手 编写一个函数,利用欧几里得算法求最大公约数,例如gcd...
第四幕 夜曲 我只有一个希望,就是在自己短暂的人生之中,面对遇见的每一件事,都能够完全明辨黑白,只是这样而已。
——《异想天开》 第二天一大早,武柘城几乎所有的媒体都竞相报道一个让市民震惊的消息。 《武柘晨报》以醒目的黑色大标题写到:“市长林清玄...记录点滴,分享沉淀
一个最简单的CLI命令行界面实现
#include "system.h"
#include "utils/ui.h"
#include "appl/cli.h"
cli命令行界面,一共可以注册MAX_CLI_COMMANDS 个命令,命令名字可以是[A-Z,a-z,0-9]的某个字母。
运行效果:
CMD& F - Flash utilities
f - Write factory mac address
n - Write the serial number
d - Dump the mac address and serial number
Enter your choice: f
Mac: 00-22-44-66-88-00
#if CFG_CLI_ENABLED
#define MAX_CLI_COMMANDS
(26+26+10)
/* Lower + upper + digit */
/* Commands forward */
APISTATIC void cli_cmd_list_commands(CLI_CMD_OP op) REENTRANT;
APISTATIC void cli_cmd_command_help(CLI_CMD_OP op) REENTRANT;
extern void APIFUNC(cli_init)(void) REENTRANT;
* Command list
* Note: We use STATIC initializer because commands could be added during
system initialization phase.
STATIC CLI_CMD_FUNC cmds[MAX_CLI_COMMANDS]; //命令列表
/*查找所有已添加命令并执行命令描述*/
APISTATIC void
APIFUNC(cli_cmd_list_commands)(CLI_CMD_OP op) REENTRANT
if (op == CLI_CMD_OP_HELP) {
sal_printf("Help - List all available commands\n");
} else if (op == CLI_CMD_OP_DESC) {
sal_printf("List all commands");
CLI_CMD_FUNC *pcmd = &cmds[0];
for(i=0; i&MAX_CLI_COMMANDS; i++, pcmd++) {
if (*pcmd) {
char c = i & 26 ?
('a' + i) : (i & 52? ('A' + i - 26) : '0' + i - 52);
sal_printf("
%c - ", c);
(*(*pcmd))(CLI_CMD_OP_DESC);
sal_printf("\n");
/*查找所有已添加命令并执行命令帮助*/
APISTATIC void
APIFUNC(cli_cmd_command_help)(CLI_CMD_OP op) REENTRANT
if (op == CLI_CMD_OP_HELP) {
sal_printf("Help - Show help information for a command\n");
} else if (op == CLI_CMD_OP_DESC) {
sal_printf("Help for a command");
CLI_CMD_FUNC *
sal_printf("Command: ");
cmd = sal_getchar();
sal_printf("\n");
if (cmd &= 'a' && cmd &= 'z') {
pcmd = &cmds[cmd - 'a'];
} else if (cmd &= 'A' && cmd &= 'Z') {
pcmd = &cmds[26 + cmd - 'A'];
} else if (cmd &= '0' && cmd &= '9') {
pcmd = &cmds[52 + cmd - '0'];
} else if (cmd == '\r' || cmd == '\n') {
sal_printf("Invalid command\n");
if (*pcmd == NULL) {
sal_printf("Command not available\n");
sal_printf("\n");
(*(*pcmd))(CLI_CMD_OP_HELP);
/*cli任务,用于跟用户交互*/
APIFUNC(cli)(void) REENTRANT
CLI_CMD_FUNC *
sal_printf("\n" CFG_CLI_PROMPT);//打印”CMD& ”字符串
cmd = sal_getchar();
//获取用户输入命令
if (cmd &= 'a' && cmd &= 'z') {
pcmd = &cmds[cmd - 'a'];
} else if (cmd &= 'A' && cmd &= 'Z') {
pcmd = &cmds[26 + cmd - 'A'];
} else if (cmd &= '0' && cmd &= '9') {
pcmd = &cmds[52 + cmd - '0'];
} else if (cmd == UI_KB_LF || cmd == UI_KB_ESC ||
cmd == UI_KB_BS || cmd == UI_KB_CR) {
ui_backspace();
sal_putchar('\n');
sal_printf("\nInvalid command\n");
if (*pcmd == NULL) {
sal_printf("\nCommand not available\n");
/*执行命令*/
sal_printf(" - ");
(*(*pcmd))(CLI_CMD_OP_DESC);
sal_printf("\n");
(*(*pcmd))(CLI_CMD_OP_EXEC);
/*添加注册命令*/
APIFUNC(cli_add_cmd)(char cmd, CLI_CMD_FUNC func) REENTRANT
CLI_CMD_FUNC *pcmd = NULL;
SAL_ASSERT(func);
if (func == NULL) {
return FALSE;
if (cmd &= 'a' && cmd &= 'z') {
pcmd = &cmds[cmd - 'a'];
} else if (cmd &= 'A' && cmd &= 'Z') {
pcmd = &cmds[26 + cmd - 'A'];
} else if (cmd &= '0' && cmd &= '9') {
pcmd = &cmds[52 + cmd - '0'];
SAL_ASSERT(FALSE);
return FALSE;
SAL_ASSERT(*pcmd == NULL);
if (*pcmd != NULL) {
return FALSE;
return TRUE;
/*移除注册命令*/
APIFUNC(cli_remove_cmd)(char cmd) REENTRANT
CLI_CMD_FUNC *pcmd = NULL;
if (cmd &= 'a' && cmd &= 'z') {
pcmd = &cmds[cmd - 'a'];
} else if (cmd &= 'A' && cmd &= 'Z') {
pcmd = &cmds[26 + cmd - 'A'];
} else if (cmd &= '0' && cmd &= '9') {
pcmd = &cmds[52 + cmd - '0'];
SAL_ASSERT(FALSE);
*pcmd = NULL;
/*CLI初始化*/
APIFUNC(cli_init)(void) REENTRANT
for(i=0; i&MAX_CLI_COMMANDS; i++) {
cmds[i] = NULL;
/*注册2个默认命令*/
cli_add_cmd('h', cli_cmd_list_commands);
cli_add_cmd('H', cli_cmd_command_help);
#endif /* CFG_CLI_ENABLED */
简单的CLI(command line interface)
简单的CLI程序
CLI (命令行接口) 简易开发
inquirer.js —— 一个用户与命令行交互的工具
HTML仿命令行界面
vue-cli从零开始实现一个仿豆瓣app(一)
nodejs实现命令行工具(一)
20分钟掌握前端编写 CLI 工具
没有更多推荐了,51CTO旗下网站
命令行界面(CLI)的消亡史
IT行业正在向所有的一切都采用应用程序编程接口(API)演进,这使得企业能够自动执行重复性任务,提高效率并减少错误的系统。但是,这引出了新的问题:在IT系统中API的大量使用会取代命令行界面(CLI)吗?
作者:佚名来源:| 06:39
IT行业正在向所有的一切都采用应用程序编程接口(API)演进,这使得企业能够自动执行重复性任务,提高效率并减少错误的系统。但是,这引出了新的问题:在IT系统中API的大量使用会取代命令行界面(CLI)吗?
网络工程师多年来一直依赖CLI进行网络配置,但市场研究公司Gartner认为,CLI正在失去其在配置和运营网络方面的地位,并预测到2020年,只有30%的网络运营团队会使用CLI,远低于目前的85%。
CLI包含多个组件:
用户输入/输出
命令行编辑,历史命令,完成的命令
输入解析、参数验证和命令调度/执行
错误处理和报告
大多数产品都包含至少两种CLI模式
交互模式:用于查询设备运行数据的命令,它通常用于收集故障排除数据,包括show命令以及查看设备配置的命令
配置模式:管理员更改设备的操作
CLI具有依靠简单的telnet或Secure
Shell会话进行通信的优点,以及用于识别和执行命令的解析引擎。它不需要额外的软件(ASN.1,JSON或XML解析器)或协议(CMIP,SNMP)。CLI的缺点也很明显,虽然CLI也可与作为API使用,但是CLI缺少错误特定的返回代码,控制系统可与理解错误的类型并采取适当的措施。有时,自动化工具还必须处理输入或输出文本中的偶尔错字,CLI通常与手动配置更改有关,这是造成企业网络中断的主要原因。
业界目前正在逐渐取代CLI,因为单次配置一台设备已经不能满足需求,需要开始配置整个IT系统。例如要在所有企业网络设备(UC终端,交换机,路由器,防火墙和负载均衡器)上部署一致的服务质量(QoS)策略。理想情况下,我们将有一个通用的QoS模型,API映射到设备特定的配置。查询QoS实施操作的通用模型将允许我们验证IT系统是否按照我们设计的那样运行。
用API替换CLI并不困难,较新的设备通常通过使用命令元素的XML或JSON编码的REST接口支持CLI和API,另外,有些设备只支持API接口,CLI只是一个使用API调用的模块。
Gartner分析师指出,将CLI转移到集中的基于策略的操作是&网络团队必须处理由于使用微服务/容器以及物联网设备泛滥所带来的规模需求的前兆&。CLI并不会完全消失,依然对深入的故障排除或测试有效果,但是相关的CLI的测试认证就不那么重要,取而代之的是架构级技能,专注于网络自动化、API编程以及与其他基础设施的集成。
为了与这种转变保持一致,Gartner建议企业在购买新基础设施时要求网络自动化,而不要让传统CLI技术影响他们的购买决策。企业还应该利用API来实现更高的网络灵活性,并将投资重点从CLI和专有认证转移到网络编程工具和通过API编排。
SD-WAN和开放网络的兴起
根据Gartner的说法,软件定义的广域网(SD-WAN)是企业在不依赖于CLI的情况下所期望的技术之一。该公司预测,到2018年,与传统路由器相比,WAN边缘基础设施更新项目中将有超过40%将基于SD-WAN设备和/或基于x86的虚拟化客户端设备,与现在不到2%的份额相比,这是企业在这方面的巨大投入。
Gartner还认为开放源代码在企业网络中扮演着更重要的角色:到2020年,开源和自建选项至少占数据中心网络市场的20%,而现在占比不到2%。
Gartner研究总监Naresh
Singh指出,DevOps组织倾向于使用开源产品,越来越多的企业计划采用DevOps方法,在2层和3层交换、路由和4-7层网络服务等核心业务领域,都有开放网络社区。OpenSwitch,ODL,ONOS,OPNFV,Nginx和HAProxy等项目也吸引了广泛的用户和供应商参与,从而使他们有更多的主流企业采用的机会。
基于意图的网络
Gartner还预测了基于意图的网络以及在分支机构部署直接互联网接入,根据Gartner的数据,10%的企业将使用基于意图的网络设计和操作工具。Gartner副总裁兼杰出分析师Joe
Skorupa解释说,&意图&从业务角度描述了网络所需的服务,而不是如何配置各个参数,并作为配置的通用语言。
基于意图的网络通过在部署之前验证设计,防止配置错误以及通过持续监控来减少网络中断。根据Gartner的数据,虽然意图型网络刚刚兴起,但企业在分支机构部署直接互联网的速度会更快。到2020年底,将有60%以上的企业部署基于意图的网络。
CLI最终会被API所取代吗?在短期之内不可能,但是CLI在企业当中所占的比例毫无疑问会下降。基于API的服务器、网络设备和IT系统等都会慢慢侵蚀CLI的占有率,但值得注意的是CLI的重要地位依然不会被取代,在企业的应用中,CLI还将长期存在。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点关注头条热点关注
24H热文一周话题本月最赞
讲师:107285人学习过
讲师:35696人学习过
讲师:44091人学习过
CTO专属活动
精选博文论坛热帖下载排行
20多年以来,《软件工程:实践者的研究方法》一书是最受学生和行业专业人员欢迎的软件工程指南。它在全面而系统、概括而清晰地介绍软件工程...
订阅51CTO邮刊

我要回帖

更多关于 安卓命令行终端 的文章

 

随机推荐