练习 28:sh

原文:Exercise 28: sh

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

你现在将继续你的 TDD 风格流程,但你将添加一个小型的 Hack 会话来起步。使用 TDD 工作的最佳方法,实际上不是首先编写测试,而是以这种方式工作:

  • 花45分钟的时间来研究这个问题。这被称为“spike”,旨在解决你可能遇到的问题或学习你需要知道的事情。
  • 使用 TODO 列表来计划你可能需要实现什么。
  • 将此计划变成 TDD 测试。
  • 运行测试来确保它失败。
  • 编写测试代码,使用你从 spike 学到的东西。
  • 审计并测试你的代码来确认质量。

当 TDD 狂热者遇到从没学过的问题时,这个过程是我看到它们实际使用的东西。快速实现一个黑魔法,让你的思维活跃,并研究问题,然后认真对待工作更加实际。如果有人告诉你这不是 TDD,只是不要告诉他们你实现做了 spike 。他们永远不会知道。

挑战练习

在本练习中,你将实现 Unix sh工具的 shell 部分。你在编码时一直使用sh,因为它在终端内部运行(PowerShell 不一样),并运行其他程序。通常它是bash,但它可能是fishcshzsh

sh工具是一个需要实现的庞大的程序,因为它也支持一个完整的编程语言,来自动化你的系统。我们不会实现编程语言,只是命令行进程运行的那部分。

要完成此任务,你需要以下库:

  • subprocess,启动其他程序。
  • readline,从用户获取输入和支持历史记录。

你不用做一个带管道和所有东西的完整的 Unix sh,但是应该实现除编程语言之外的所有东西。你的实现应该能够执行以下操作:

  • 使用readline,从提示开始,并从用户获取命令来执行。
  • 将命令解析成可执行文件和参数。
  • 使用subprocess执行具有参数的命令,并控制所有的输出。

为了起步,你可以做你的 spike,来学习readlinesubprocess或两者,任何你认为是必要的或不熟悉的东西。一旦你完成了 spike,那么你开始编写测试和实现系统。

研究性学习

你可以实现管道吗?就是你键入history | grep python,并且|history的输出发给grep的输入。

深入学习

如果你打算深入了解 Unix 进程和资源管理,你可以研究我的项目python-lust。它并不是非常大,并且充满了许多小技巧。