25行Ruby代码编写Shell
如果使用Linux或Mac,每次你打开一个终端使用shell应用程序。shell是一个接口,帮助你执行命令在您的系统。
此外,外壳也提供环境变量和有用的功能,如一个命令历史和自动完成。
如果你是什么样的人,喜欢学习如何工作在幕后,这篇文章将为你是完美的!
一个Shell是如何工作的呢?
构建自己的shell应用程序让我们思考一个shell是:第一,有一个提示,通常与一些额外的信息,比如你的当前用户和当前目录,然后输入一个命令与当你按下enter结果都显示在你的屏幕上。
是的,这听起来非常基础,但是这没有提醒你什么吗?
如果你想pry那么你是对的!shell基本上在REPL(Read-Eval-Print-Loop)适用于您的操作系统。
我们知道我们可以写您的shell的第一个版本:
这将给我们一个最小,但功能层。我们可以改善通过使用许多其他添加应用程序使用的库。图书馆被称为Readline.
使用Readline库
Readline的一部分Ruby标准库,所以没有安装,你只需要require它。
使用的优势之一Readline是,它可以自动保持命令历史。它还可以照顾打印命令提示符和许多其他的事情。
这里是我们外壳的v2,这次使用Readline:
这是伟大的,我们摆脱了puts提示与现在我们有一些强大的功能Readline。例如,我们可以使用键盘快捷键来删除一个字(CTRL + W),甚至搜索历史(CTRL + R)!
让我们添加一个新的命令打印完整的历史:
现在你可以输入hist命令历史记录
添加自动完成
谢谢你喜欢的外壳的自动完成功能你可以省下一大笔打字。Readline使得它很容易将此功能集成到您的shell。
让我们开始自动完成命令从我们的历史。
例子:
这个代码你应该能够自动完成之前通过按输入命令(tab)关键。现在让我们再进一步和添加目录自动完成。
例子:
completion_proc返回的列表可能的候选人,在这种情况下,我们只需要检查输入的字符串是否使用目录名称的一部分Dir.glob。Readline将其余的照顾!
系统实现方法
现在你应该有一个外壳,与历史&自动完成,不太坏了25行代码
但是总有一些事情我想深入挖掘,所以你可以得到一些见解在幕后发生了什么实际执行一个命令。
这是做的system方法,这种方法在C只发送你的命令/bin/sh,这是一个shell应用程序。让我们来看看你可以实现什么/bin/sh在Ruby中。
系统方法:
这是发生了什么fork当前进程创建一个新的副本,然后这个过程被命令我们要运行通过exec方法。这是一个很常见的模式在Linux编程。
如果你不叉然后当前进程所取代,这意味着当您正在运行的命令(ls,cd或其他)完成你的Ruby程序将终止。
你可以看到这里发生的:
结论
在本帖中,你知道一个shell是一个添加的接口(想想irb/pry)与系统进行交互。您还了解了如何通过使用强大的构建自己的壳Readline库,它提供了许多内置功能,如历史&自动完成(但你必须定义如何工作)。
然后您学习了fork+exec模式通常用于Linux编程项目。
如果你喜欢这篇文章你能帮我一个忙&分享与你所有的Ruby的朋友吗?它将帮助博客成长和更多的人可以学习