# 練習 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