所以今天,我在Golang学到了一些新东西和一些基本的东西。它正在制作一个简单的交互式shell。这只是一个非常简单的应用程序,但它看起来很酷。

我用Golang工作了一年多。人们已经创建了很多工具,例如:spf13的cobra,或者更多可以帮助我们进行命令行应用的工具。但是,不知怎的,我很好奇如何制作一个简单的,没有与其他外部库的依赖。

因此,出于好奇,我开始搜索如何在Google中制作它。但我发现只有使用其他外部依赖项的教程。每个人都只是推广自己的库,以便轻松制作互动外壳。我只需要用纯Golang包(没有外部依赖)来制作一个简单的

我自己做了一个简单的Shell应用程序。在这里,我将解释我是如何在下面做到的。

Shell

所以在制作一个简单的Shell应用程序之前,我想确保我的意思是shell和你的意思相同。

对我来说,Shell是一个应用程序,它将充当最基本的用户界面(基于文本的界面)。有些人可能会说它是命令行界面(CLI)。

制作应用程序

为了制作应用程序,对于最简单的原型,我会像这样做。


从终端读取命令

要做到这一点,首先要做的是阅读输入。我需要从终端读取输入。对此,我这样做。


执行命令

然后执行命令。从终端读取命令字符串后,立即执行命令。


直到这里,现在我可以运行我的简单shell应用程序,但它只能运行一个命令。运行命令后,它将停止。

添加无限循环

使其在执行一次后接收每个命令。我们需要将它添加到无限循环中。


如果我们运行应用程序,它将如下所示


处理参数

在此之前,我已经完成了我的第一个CLI应用程序。但它仍然不接受参数。如果我传递一个参数,那么它将抛出一个错误。


要阅读这些论点,我将在下面进行如下操作。首先,我将命令拆分为一个字符串数组。


为了拆分文本,我使用包字符串中的Fields函数。此功能类似于拆分字符串功能。如果string.Split将按给定的特定分隔符拆分字符串。但strings.Fields将用空格分隔单词。

比如:


现在,我的简单shell已经接受并处理给定的参数。现在,应该运行此命令。


添加退出命令

但是,此应用程序仅适用于在环境中注册的任何内置应用程序。像exit这样的命令不存在,因为它是在每个CLI应用程序中编程的。

然后,我为系统中没有内置应用程序的每个命令创建一个switch-case处理程序,如theexit命令。


添加自定义命令

要添加自定义命令,我只需将其添加到switch-case处理程序即可。例如,我想添加一个像plus这样的命令。此命令在任何CLI应用程序中都不存在。我想这样做:


为此,我只需要添加一个sum函数并在switch-case中添加命令案例处理程序



结论

最后,它只是一个非常简单的应用程序。但是,当然,我在做这件事时会学到一些东西。github项目bxcodec/simpleshell。