# 练习 28:`sh`
> 原文:[Exercise 28: sh](https://learncodethehardway.org/more-python-book/ex28.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
你现在将继续你的 TDD 风格流程,但你将添加一个小型的 Hack 会话来起步。使用 TDD 工作的最佳方法,实际上不是首先编写测试,而是以这种方式工作:
+ 花45分钟的时间来研究这个问题。这被称为“spike”,旨在解决你可能遇到的问题或学习你需要知道的事情。
+ 使用 TODO 列表来计划你可能需要实现什么。
+ 将此计划变成 TDD 测试。
+ 运行测试来确保它失败。
+ 编写测试代码,使用你从 spike 学到的东西。
+ 审计并测试你的代码来确认质量。
当 TDD 狂热者遇到从没学过的问题时,这个过程是我看到它们实际使用的东西。快速实现一个黑魔法,让你的思维活跃,并研究问题,然后认真对待工作更加实际。如果有人告诉你这不是 TDD,只是不要告诉他们你实现做了 spike 。他们永远不会知道。
## 挑战练习
在本练习中,你将实现 Unix `sh`工具的 shell 部分。你在编码时一直使用`sh`,因为它在终端内部运行(PowerShell 不一样),并运行其他程序。通常它是`bash`,但它可能是`fish`,`csh`或`zsh`。
`sh`工具是一个需要实现的庞大的程序,因为它也支持一个完整的编程语言,来自动化你的系统。我们不会实现编程语言,只是命令行进程运行的那部分。
要完成此任务,你需要以下库:
+ [`subprocess`](https://docs.python.org/2/library/subprocess.html),启动其他程序。
+ [`readline`](https://docs.python.org/2/library/readline.html),从用户获取输入和支持历史记录。
你不用做一个带管道和所有东西的完整的 Unix `sh`,但是应该实现除编程语言之外的所有东西。你的实现应该能够执行以下操作:
+ 使用`readline`,从提示开始,并从用户获取命令来执行。
+ 将命令解析成可执行文件和参数。
+ 使用`subprocess`执行具有参数的命令,并控制所有的输出。
为了起步,你可以做你的 spike,来学习`readline`或`subprocess `或两者,任何你认为是必要的或不熟悉的东西。一旦你完成了 spike,那么你开始编写测试和实现系统。
## 研究性学习
你可以实现管道吗?就是你键入`history | grep python`,并且`|`将`history `的输出发给`grep`的输入。
## 深入学习
如果你打算深入了解 Unix 进程和资源管理,你可以研究我的项目[`python-lust`](https://github.com/zedshaw/python-lust)。它并不是非常大,并且充满了许多小技巧。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb