美文网首页
无标题文章

无标题文章

作者: cqcheng001 | 来源:发表于2016-08-05 00:13 被阅读0次

    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的朋友吗?它将帮助博客成长和更多的人可以学习

    相关文章

      网友评论

          本文标题:无标题文章

          本文链接:https://www.haomeiwen.com/subject/rykhsttx.html