我喜歡命令行。我第一次接觸命令行是在 1997 的 DOS 6.2 上。我學習了各類命令的語法,並展現瞭如何在目錄中列出隱藏的文件(attrib)。我會每次仔細檢查命令中的每一個字符。 當我犯了一個錯誤,我會從頭開始從新輸入命令。直到有一天,有人向我展現瞭如何使用向上和向下箭頭按鍵遍歷命令行歷史,我被震驚了。html
後來當我接觸到 Linux 時,讓我感到驚喜的是,上下箭頭保留了它們遍歷歷史記錄的能力。我仍然很仔細地打字,可是如今,我瞭解如何盲打,而且我能打的很快,每分鐘能夠達到 55 個單詞的速度。接着有人向我展現了 tab 補完,再一次改變了個人生活。python
在 GUI 應用程序中,菜單、工具提示和圖標用於向用戶展現功能。而命令行缺少這種能力,可是有辦法克服這個問題。在深刻解決方案以前,我會來看看幾個有問題的 CLI 程序:linux
一、 MySQLgit
首先讓咱們看看咱們所鍾愛的 MySQL REPL。我常常發現本身在輸入SELECT * FROM而後按Tab的習慣。MySQL 會詢問我是否想看到全部的 871 種可能性。個人數據庫中絕對沒有 871 張表。若是我選擇yes,它會顯示一堆 SQL 關鍵字、表、函數等。(LCTT 譯註:REPL —— Read-Eval-Print Loop,交互式開發環境)github
二、 Pythonsql
咱們來看另外一個例子,標準的 Python REPL。我開始輸入命令,而後習慣按Tab鍵。瞧,插入了一個Tab字符,考慮到Tab在 Python 源代碼中沒有特定做用,這是一個問題。docker
好的用戶體驗shell
讓我看下設計良好的 CLI 程序以及它們是如何克服這些可發現性問題的。數據庫
自動補全: bpythonapp
Bpython 是對 Python REPL 的一個很好的替代。當我運行 bpython 並開始輸入時,建議會當即出現。我沒用經過特殊的鍵盤綁定觸發它,甚至沒有按下Tab鍵。
當我出於習慣按下Tab鍵時,它會用列表中的第一個建議補全。這是給 CLI 設計帶來可發現性性的一個很好的例子。
bpython 的另外一個方面是能夠展現模塊和函數的文檔。當我輸入一個函數的名字時,它會顯示這個函數附帶的簽名以及文檔字符串。這是一個多麼使人難以置信的周到設計啊。
上下文感知補全:mycli
mycli 是默認的 MySQL 客戶端的現代替代品。這個工具對 MySQL 來講就像 bpython 之於標準 Python REPL 同樣。mycli 將在你輸入時自動補全關鍵字、表名、列和函數。
補全建議是上下文相關的。例如,在SELECT * FROM以後,只有來自當前數據庫的表纔會列出,而不是全部可能的關鍵字。
模糊搜索和在線幫助: pgcli
若是您正在尋找 PostgreSQL 版本的 mycli,請看看 pgcli。 與 mycli 同樣,它提供了上下文感知的自動補全。菜單中的項目使用模糊搜索縮小範圍。模糊搜索容許用戶輸入總體字符串中的任意子字符串來嘗試找到正確的匹配項。
pgcli 和 mycli 在其 CLI 中都實現了這個功能。斜槓命令的文檔也做爲補全菜單的一部分展現。
可發現性: fish
在傳統的 Unix shell(Bash、zsh 等)中,有一種搜索歷史記錄的方法。此搜索模式由Ctrl-R觸發。當再次調用你上週運行過的命令時,例如 ssh或 docker,這是一個使人難以置信的有用的工具。 一旦你知道這個功能,你會發現本身常常會使用它。
若是這個功能是如此有用,那爲何不每次都搜索呢?這正是 fish shell 所作的。一旦你開始輸入命令,fish 將開始建議與歷史記錄相似的命令。而後,你能夠按右箭頭鍵接受該建議。
命令行規矩
我已經回顧了一些解決可發現性的問題的創新方法,但也有一些基本的命令行功能應該做爲每一個 REPL 所實現基礎功能的一部分:
總結
在第 2 節中,我未來看看 Python 中使你可以實現這些技術的特定庫。同時,請查看其中一些精心設計的命令行應用程序:
本文地址:http://www.linuxprobe.com/excellent-command-terminal.html