面向開發人員的命令行工具
已發表: 2022-03-11在當今的在線世界中,吸引用戶的戰鬥仍在繼續,應用程序製造商更喜歡移動應用程序或網絡應用程序。 桌面應用程序變得越來越不重要。 此外,它們也往往只是 Web 應用程序的富客戶端——Electron 是流行的首選平台。
這是否意味著我們將很快放棄桌面作為平台? 不,當然不是,我不會這麼說。 此外,雖然 GUI 應用程序最近似乎一直停滯不前,但有一部分桌面應用程序仍在繼續增長。
你看過任何以黑客為主角的電影嗎? 通常情況下,這些人在顯示某種終端的顯示器前工作(通常具有深色背景和淺色前景)。 反過來,這個終端往往會充斥著經過的角色,這些角色顯然對觀看它們的人有一定的意義。
黑客在行動中的這種表現經常被專業開發者嘲笑,甚至有一些程序模擬各種“黑客”效果,只是為了好玩。
然而,在現實世界中,命令行工具並沒有用於娛樂價值。
為什麼我們仍然使用命令行界面工具
本文重點介紹使用命令行界面 (CLI) 工具的實用方面。 了解 CLI 命令和使用質量工具可以提高您的工作效率,還可以為各種自動化方法打開大門,這些方法對於文本界面比使用 GUI 應用程序更實用。
您可以更好地在 GUI 中執行重複性任務,以至於您的多次點擊被視為一次長點擊。 問題是,這仍然比不上專門腳本的效率。 更重要的是,手動執行相同的操作會增加認知負擔和增加人為錯誤的可能性。 像往常一樣,我們依靠計算機來處理人類可能會覺得無聊、重複或不堪重負的任務。
值得知道的是,終端工具可以提供多種類型的接口。 有像 ls 這樣的非交互式的,它只是接受參數並提供輸出。 在包管理器中最常見的是交互式或半交互式界面。 (“您確定要從未經驗證的來源繼續安裝嗎?”)然後,有文本用戶界面 (TUI),它們是交互式 GUI 應用程序,旨在適應終端的限制。 最著名的可能是午夜指揮官 (mc),它是極受歡迎的(90 年代)諾頓指揮官的克隆。
基本命令行工具
如果你想成為一名控制台居民,你需要為自己配備一套最低限度的命令行開發工具——最基本的。 您絕對不能沒有的東西是交互式外殼(旨在通過方便的製表符完成現代的東西)和文本編輯器。
現在,我將提到UNIX 哲學,它通常是該工具的作者做出的設計決策背後的基礎,無論是否有意識。 一些關鍵點可以總結如下:
- 將所有內容視為文件。
- 只做一件事,但要把它做好。
- 從標準輸入讀取,寫入標準輸出,並將錯誤傳達給標準錯誤流。
- 成功時,返回代碼 0。非零值表示錯誤(可以通過確切的返回代碼指定)。
- 允許命令鏈接和腳本。
貝殼
打開終端時首先看到的是外殼。 這是使用戶和機器之間的交互成為可能的部分。 它解釋您的命令,將它們拆分為程序名稱和參數,並執行您向其發送的所有 shell 命令。
從歷史上看,有許多不同種類的貝殼。 其中最流行的是csh (C Shell) 和 Bourne Shell 的各種實現(通常簡稱為sh )。 Bourne Shell 擴展到 Korn Shell,這也獲得了一些牽引力,並且仍然被其愛好者使用。 Csh 目前是某些 BSD 系統上的默認 shell,而幾乎所有其他類 UNIX 操作系統都更喜歡某種 Bourne Shell。 Linux 發行版傾向於使用 bash,而 Mac OS X 將 zsh 作為默認選擇。
除了 Windows 系統上的 Microsoft PowerShell,還有其他可能性,但它們遠沒有那麼流行。 PowerShell 的部分靈感來自交互式 UNIX shell,例如 zsh,部分來自 .NET 運行時。 它不是將所有內容都視為文本,這是 UNIX 世界中常見的概念,它允許對數據進行面向對象的操作。
儘管 Microsoft PowerShell 在 Windows 領域非常流行,但許多源自 UNIX 的程序(最著名的是 Git、Autotools 或 Make)往往更喜歡 Bourne Shell 的某些變體。 正因為如此,msys(與 Git for Windows 捆綁在一起)、Cygwin 或微軟最近的 WSL 等項目誕生了。 如果您想在 Windows 上獲得類似 Linux 的感覺,MSys 是這裡的最佳選擇。 如果您想要一個能夠運行標準 Linux 二進製文件的全功能 Linux 環境,那麼 WSL 就是您的最佳選擇。 對於介於兩者之間的東西——UNIX API 但編譯為 Windows 可執行文件(只有在你真正知道為什麼需要它時才使用它)——Cygwin 就是答案。
編輯
一旦你熟悉了你的 shell,你會想要學習一些有用的技能。 由於大多數編碼工作都圍繞著編寫文本(代碼、自述文件、提交消息),所以對交互式文本編輯器的良好了解是必不可少的。 有很多可供選擇,並且由於編輯器是任何開發人員最必要的工具之一,對於哪個編輯器最好,可能有同樣多的意見。
最流行的文本編輯器可以分為兩個基本組:簡單文本編輯器和可編程文本編輯器。
兩者都非常適合編寫代碼,但是,顧名思義,可編程的提供了塑造和定制編輯器的能力,以完全滿足您的需求。 不過,這是有代價的,因為它們的學習曲線往往更陡峭,並且可能需要更多時間來設置。
基本文本編輯器
在簡單的文本編輯器中,GNU Nano 是最普遍的。 實際上,它是 pico 編輯器的克隆,所以如果您的系統上沒有一個,您可以嘗試另一個。 另一個更現代的替代品是微型編輯器。 如果你想要一些簡單和可擴展的東西,這個是一個很好的起點。
可編程文本編輯器
許多開發人員依賴於來自不同陣營的可編程編輯器,例如 Vim 和 GNU Emacs。 兩種編輯器都可以在控制台或 GUI 模式下運行,並且都對其他軟件中的鍵綁定產生影響。 它們不僅提供 API,還提供內置的實際編程語言。 Emacs 專注於 LISP,而 Vim 使用自己的 VimL,但它也提供與其他流行腳本語言(如 Lua、Perl、Python 或 Ruby)的接口。 一種更新的 Vim 方法,稱為 Neovim,也值得一提,因為它開始得到認真的追隨者。
這可能有點令人困惑,但也有一個名為 vi 的編輯器,它是 Vim 的前身(順便說一下,它代表“ Vi improvided ”)。 它比 Vim 簡單得多,但如果你有足夠的信心用 Vim 編寫代碼,如果你發現自己需要使用 vi,這對你來說應該不是挑戰。
由於 pico/GNU Nano 和 vi/Vim 通常預裝在各種系統上,因此至少掌握它們的基礎知識是個好主意(退出 Vim 對於初學者來說是一個眾所周知的難題)。 這樣,如果您需要在遠程計算機上編輯某些內容,無論已經存在什麼編輯器,您都可以準備好。 在您的私人設備上,隨意使用您認為最舒適的任何編輯器。
默認系統編輯器
最後要注意的一點是,您的系統可能有所謂的默認編輯器。
$EDITOR
環境變量指向默認編輯器,在與 Bourne 兼容的 shell(sh、bash、ksh、zsh)中,您可以通過輸入echo $EDITOR
來查看它。 如果該值與您的個人選擇不同,您可以通過將export EDITOR=my-awesome-editor
添加到 shell 的運行時配置( ~/.profile
、 ~./bashrc
、 ~/.zshrc
等)來自行設置。
其他程序,例如版本控制系統和郵件客戶端,將在需要更長的文本輸入時使用此編輯器。
復用器
一旦你開始在 CLI 中做一些嚴肅的事情,你就會遇到在任何給定時間只能保持一個應用程序打開的限制。 編碼時,您可能想要編輯代碼、執行它、修復錯誤並再次執行。 在查找錯誤時,您可能希望列出日誌並查看向服務器發送請求時記錄的內容。 通常,這意味著在兩個應用程序之間不斷切換或打開多個終端窗口。
這是終端多路復用器可以幫助您的地方。 當談到多路復用器時,有些人立即認為主題是 GNU Screen。 它是同類工具中第一個廣泛使用的工具,今天仍然非常流行(通常默認安裝)。 它的現代替代品是tmux ,不出所料,它代表“終端多重 x er ”。

這兩個允許您在給定的終端會話中打開多個窗口並在這些會話之間自由切換。 它們允許您將窗口拆分為窗格,這有助於同時運行多個應用程序並實時觀察它們的輸出(無需切換任何窗口)。 此外,它們以客戶端-服務器模式工作,這意味著您可以在任何給定時間分離它們,稍後再回來繼續您上次中斷的工作。 當人們想要持久的 IRC 會話時,最後一個功能導致 Screen 的流行。
對於大多數用例,GNU Screen 或 tmux 對你來說應該是很好的,但如果由於某種原因你認為它們佔用的資源太重,還有更輕的替代品。 有 dtach/atach 和 abduco。 他們故意限制範圍,但可以很好地履行各自的職責。
包管理器
此時,您可能會開始考慮在您的機器上安裝所有上述軟件。 一個問題是每個工具都有不同的安裝說明。 有時,您需要下載源代碼並自己編譯它們,有時您會得到自包含的二進製文件,有時您會得到所謂的二進制包,這通常意味著與一些元數據一起壓縮的可執行文件。
為了簡化安裝軟件的過程,操作系統創建者提出了包管理器的概念。 簡而言之,包管理器就像 CLI 和桌面應用程序的應用程序商店。 它比實際的應用商店早了幾十年。 問題是幾乎每個系統都有自己的包管理器。 Debian、Ubuntu 和衍生的 GNU/Linux 發行版使用 APT,基於 Red Hat 的發行版更喜歡 yum 或 DNF,其他 Linux 發行版有更奇特的軟件安裝方式,不同的 BSD 克隆也是如此。 除了內置的包管理器,還有用戶安裝的包管理器,比如用於 MS Windows 的 Chocolatey 和用於 Mac OS X/macOS 的 Homebrew。 當您想編寫有關如何安裝程序的說明時,您最終可能會為每個系統編寫案例。 似乎有點過分了,不是嗎?
幸運的是,最後提到的系統 Homebrew 可能是最便攜的系統,這要歸功於 Linuxbrew,它是 Homebrew 到 GNU/Linux 系統的一個端口。 有趣的是,如果你想在 Microsoft Windows 上獲得類似的用戶體驗,它甚至可以在 WSL 上運行。 但請記住,WSL 不受官方支持。
那麼,除了便攜性,Homebrew 還能提供什麼? 首先,它不會干擾系統包,因此您安裝的所有內容都位於操作系統的單獨層上。 此外,安裝軟件包通常不需要 root 權限。 因此,您可以擁有穩定且經過測試的系統包,但同時檢查其較新版本而不會犧牲系統的穩定性。
如果您想測試編輯器,我之前提到過,您需要在使用 Homebrew 或 Linuxbrew 的系統上運行以下命令:
brew install emacs micro nano vim neovim
。
閃亮的東西
我們已經討論過的內容無疑對工作很有用。 但也有一些應用程序,雖然不是必需的,但仍為日常生活帶來舒適感。 您可能不需要它們,但了解它們總是值得的。
交互式過濾器
搜索命令歷史記錄可能很乏味。 雖然 bash 和 zsh 都具有 Ctrl+R 鍵綁定,但它一次只顯示一個替換。 更重要的是,您需要輸入您之前使用的確切文本。 由於這是一個很常見的操作,一旦你開始使用命令行,它看起來是一個可以改進的地方。
交互式過濾器,如 fzy、percol、peco 或 fzf 可幫助您過濾長行文本。 這可以是前面提到的命令歷史記錄、項目目錄中的所有代碼行,也可以是find .
. 這裡的一般想法是首先向您展示所有可用的行,然後依靠模糊查找算法過濾掉所有不匹配的內容。
例如,將 Ctrl+R 綁定到 fzf 會顯示最新命令的列表,您可以使用箭頭向上和向下導航,或者您可以鍵入git
以僅顯示內部某處具有 Git 的命令。 就個人而言,當我使用一個沒有交互式過濾器的 shell 時,我突然感到有點失落。 這個功能真的很給力!
此外,您可以在可編程文本編輯器中使用交互式過濾器。 這樣,您將在 shell 和編輯器之間擁有統一的搜索功能。
交互式導航器
當我主要處理 C++ 項目時,Facebook PathPicker 給了我很大的幫助。 編譯器生成的錯誤日誌可能會變得非常大而且非常討厭,並且能夠在該日誌中找到實際路徑的能力是生產力的福音。
在任何給定的文本文件中,或與 tmux 一起使用時屏幕的內容中,fpp 過濾除文件路徑之外的所有內容。 然後它會顯示一個 UI,您可以在其中選擇一個或多個這些路徑並使用它們運行命令。 當然,最常見的響應是在編輯器中打開文件,這是默認操作。
用戶界面
您從事的項目中至少有一個使用 Git 作為版本控制系統。 雖然功能非常強大,但 Git CLI 並不是出色用戶體驗的巔峰之作。 為了減輕閱讀 Git 幫助$SUBCOMMAND
中所有選項的壓力,我建議您查看 tig。 它為從中受益的操作提供了一個不錯的控制台 UI,例如log
或blame
。
另一個旨在幫助 GIt 用戶的工具是 fac,它是Fix All Conflicts的首字母縮寫。 正如您可能已經猜到的那樣,當您在進行合併或變基時遇到衝突時,它會派上用場。 它是 vimdiff 等其他合併工具的替代品。
文件管理器
90 年代曾有一段時間,每個人都想要一個兩窗格的文件管理器。 這一趨勢始於諾頓指揮官。 許多其他人也走上了同樣的道路,但仍然看到穩定用戶群的是午夜指揮官。 最明顯的用例是使用 mc 來操作本地文件,但在使用遠程機器時它也非常有用。
像大多數命令行程序一樣,它非常輕量級,因此通過 ssh 運行它沒有問題,並且由於支持 FTP 和 FISH 協議,您可以在一個窗格中顯示本地文件系統,在另一個窗格中顯示遠程文件系統 — 方便當您想避免鍵入或複製文件名作為 scp 的參數時使用此功能。
CLI 工具只是為了好玩
他們說:“只工作不玩耍讓傑克成為一個呆板的男孩。” 有很多程序,命令行和其他方式,只為您提供娛樂。 流氓視頻遊戲屬於這一類。 它甚至為整個遊戲類型命名! 其他流行的玩具是幸運和牛說,例如,如果你在 CI 腳本的某個地方使用它們,它們可以讓你的一天不那麼沉悶。
但對於我們中的一些人來說,首先使用控制台的主要吸引力在於感覺自己像電影中的黑客。 No More Secrets 和 Hollywood Hacker 很好地代表了這個群體。 當有人看著你工作時試試看,你的黑客信譽肯定會上升!
命令行實踐
那麼,命令行可以抵消學習如何使用 shell、編輯器和各種應用程序的所有開關所花費的時間,有什麼吸引人的地方呢? 簡短的回答是生產力,它來自兩件事:
一是當您只看到一個終端窗口時,您可以更加專注,因為沒有太多可以分散您的注意力。 沒有通知彈出,沒有廣告,沒有漂亮小貓的照片。 只有你和你的目標。
第二件事是自動化。 您可以將幾個經常組合的操作放在一個腳本中,然後將其作為一個整體調用,而不是每次都手動輸入。 通過搜索 shell 的歷史,您可以快速回到您曾經編寫的特別複雜的命令。 基本上,您可以錄製和回放任何內容,並且代碼可以作為您所做操作的文檔。
添加別名的能力也有助於獲得收益。 例如,我發現自己經常在 Git 中通過更新同一個提交直到它完美(目前)來製作提交。 一旦我暫存了所需的文件,我就會運行git carmh
。 不要試圖在手冊中查找它,因為它是我的私人別名,意思是commit --amend --reuse-message=HEAD
。 它肯定會節省一些打字。
問題是,人們會厭倦一遍又一遍地重複相同的動作,而無聊會降低注意力。 這可能導致錯誤和錯誤。 避免它們的唯一方法是不要將高焦點和低焦點動作交錯。 編寫代碼是高度關注的,審查提交消息和內容是高度關注的,但是當您需要在這里和那裡重複幾次機械點擊以進入提交審查階段時,您的關注度可能會降低。 當然,命令行並非沒有此類機械活動,但由於自動化,您可以避免其中的大部分活動。
進一步探索
您可能已經知道本文中提到的部分或全部命令行工具。 您可能在閱讀時學到了一些新的有用的東西。 如果是這樣,那就太好了——我在這裡的目的不是提供對不同工具的全面概述和比較,而是展示一些我發現對我的日常工作很有幫助的重要工具,希望你會發現其中一些有用,也。
那裡有更多有趣的命令行程序,如果您對它們感興趣,我建議您查看 Awesome Shell 精選列表,其中列出了當今可用的一些最佳命令行工具。
大多數 GUI 應用程序都有對應的終端。 這包括 Web 瀏覽器、電子郵件客戶端、聊天客戶端(IRC、Slack、XMPP)、PIM 套件或電子表格。 如果您知道我沒有提到的任何好程序,請在評論中提出。