高效程序員必備的六大命令行工具

作者 | Adam Gordon Bell 

譯者 | 王啓隆

出品 | CSDN(ID:CSDNnews)

程序員少不了和命令行打交道。而一個好的工具可以讓工作變得更容易、更效率,一個好的工具可以解鎖新的能力:將不可能化爲可能,或者簡單化一件事情。很明顯當你使用一種工具時,它會驅使你走向某種類型的研究,這種研究方式會因爲這個工具而更加輕鬆,因爲你有了另一種思維方式,你的工具讓其他任何人都做不到的事情得以發生,所以它能讓你更有獨創性。

我在 earthly.dev 找到了一個分享命令行工具的文章,以下是譯文:

最近我向命令行工具箱添加了一些新工具,在本文,我想分享一些我發現的有價值的工具。

Broot

我不知道我是怎麼認識 Broot 的,但它很實用。當你打開一個小目錄,並想要查看 land 的位置,那麼 tree 功能可以優秀地完成這點。

✗ tree
.
├── dartboard.png
├── header.jpg
├── opensign.png
├── quote1.png
└── trophy.png
0 directories, 5 files

但是,如果目錄有很多文件或子目錄,tree 就沒有那麼有用了:當文件滾動到你面前時,你只能看到最後一個屏幕上全是信息。

$ tree 
< scrolling text for a long time >
├── banner.js
└── index.html
328 directories, 2028 files

Broot 通過分析終端窗口的大小並調整其輸出以適應它,來解決這個問題。

你可以在 Broot 中使用方向鍵進行導航,它也有助於通過傳入 - w 標誌 (broot -w) 來跟蹤磁盤空間的使用情況:

它可以做很多其他的事情,可以看看 GitHub guide 的指南,但對我來說,它只是提供了一個更好的 tree。

ℹ️ 安裝 Broot

使用 brew 以在 MacOS 上安裝,或者按照其他環境的安裝說明安裝。

brew install broot

Funky

如果你希望將終端用作 IDE,那麼根據當前目錄更改終端是很有幫助的。有很多方法可以做到這一點,比如 DirEnv。當進入目錄時,DirEnv 會加載和卸載. env 文件;這點和 smartcd 類似。它允許在更改到特定路徑時運行 shell 腳本——這讓用戶可以啓動和停止服務,更改提示符,或任何用戶想要的內容。

然而,我最喜歡用的是 Funky,它有個很怪的名字。它通過 “使 shell 函數更容易定義、更靈活、更具有交互性而將其提升到下一個層次。”

Funky 的工作方式很簡單:在進入一個目錄時,Funky 會查找一個包含 bash 函數列表的. funky 文件。它會把這些文件加載,並在用戶退出時卸載。

這意味着,當我進入這個 Jekyll 博客(一個 ruby 開發的博客系統)的目錄時,我已經加載了新的別名,用於創建新文章、檢查標記、拉入圖像等等。
我可以通過鍵入 Funky 列出這些:

$ funky
lint() { markdownlint --fix "./_posts/*.md"; }
set-header() { cp "$(latest-image)" "$(image-folder)/header.jpg"; }
set-image() { cp "$(latest-image)" "$(image-folder)/$(date +%s).png"; }

不過 Funky 可以做的不止這些。它具有交互式添加和編輯函數以及註冊全局函數和別名的功能。但我喜歡的是它能夠在特定的上下文中快速給出一個命令,一個簡短的別名。

ℹ️ 安裝 Funky

安裝 Funky 需要用到 pip:

pip3 install pyfunky

並在你的 .zshrc, bashrc 或者類似的東西上加上 hooks:

## find where funky.sh was installed by pip and source it
source /usr/local/lib/python3.9/site-packages/scripts/shell/funky.sh

Fuzzy Finder (FZF)

爲這篇文章使用 fzf 定位生成的圖像

如果說 Funky 和 Broot 提高了生產力,那麼更多的工具將如虎添翼。所以我去 Lobste.rs 詢問人們還在使用什麼其他工具。FZF 被提到了很多次,而現在我也開始使用它了。

FZF 是一個命令行模糊查找器。它的運行速度很快,而且在需要在命令行輸入值的許多地方,它可以交互式地讓你基於模糊關鍵字匹配篩選選項。

如果用戶安裝了快捷方式 (/usr/local/opt/fzf/install),就可以通過在任何地方鍵入 **,獲得一個交互式模糊查找器來縮小到所需的路徑。FZF 還可以更快地搜索歷史記錄。

它是一個 UNIX 過濾器,它讀取輸入,顯示一個可向下過濾的交互式列表,然後將選中的項發送到另一端,但這種描述低估了它的用處。

ℹ️ 安裝 FZF

使用軟件包管理器作爲一個選擇 安裝 FZF:

brew install fzf

並在你的 .zshrc, bashrc 或者類似的東西上加上 hooks:

#ZSH
source ~/.fzf.zsh 
#BASH
source ~/.fzf.bash

McFly

使用 McFly 在此路徑中常見的普通命令

當你想要打開一個文件 (vim **) 時,FZF 非常適合在命令行中過濾文件路徑,但是對於完成命令行,有比原始歷史文件更多的可用信息。McFly 試圖使用這些額外的信息來提供更多相關的結果。

額外的信息是什麼?

首先,McFly 在其啓發式排名中考慮了以下選項:

它在 SQLite 數據庫中追蹤所有這些信息,它還通過以下方式追蹤和權衡建議:

被建議失敗的命令是令人討厭的,但是我從來沒有考慮過基於當前目錄或從未被選擇的降級項來縮小選擇範圍。

McFly 使用神經網絡來進行排名,一個可能的缺點是,如果你的 SQLite 數據庫太大,那麼在提出建議時就會滯後。但是,可以使用 MCFLY_HISTORY_LIMIT 來限制這種增長。

我只使用了幾天,所以我不能給它一個公平的評價,但這種概念——使用額外的信息來定製工具,以適應實際使用——令人充滿希望。

ℹ️ 安裝 McFly

 有許多方法可以安裝 McFly。比如說 brew:

brew tap cantino/mcfly
brew install mcfly

並在你的 .zshrc, bashrc 或者類似的東西上加上 hooks:

eval "$(mcfly init zsh)"

二進制文件發出初始化腳本,而不是將初始化腳本轉儲到主目錄,這是一種很好的做法。而 Zoxide——下面要介紹的工具——也能做到這一點。此外,FZF 會干擾 McFly 的 CTRL-R,必須註釋掉 FZF 初始化腳本中的這一行以使 McFly 正常工作。

Better CD

使用 zoxide 作爲 cd 的替代品

對於一些完成路徑,FZF 工作得很好,但在使用 cd 更改目錄時,它沒有幫助:從主目錄輸入 cd **TAB 後,FZF 需要一段時間來構建完整的列表選項。它比使用現有的 ZSH 完成的 “cd TAB TAB  ” 導航到文件夾更快。

然而,有許多工具試圖改進 cd、autojump、z 和 Fasd 的所有跟蹤目錄使用情況,併爲你提供一個簡單的快捷鍵來更改到常用訪問的目錄。

R /commandline 詳細討論了這些不同的 cd 替換,但其中最有動力的是 Zoxide。Zoxide 是用 Rust 語言重寫的 z,並且承諾可以提高速度。

安裝之後,用戶可以像 cd (z ~/path/foo/bar)一樣使用它,但是也可以根據路徑的文本匹配 (z bar ~= cd ~/path/foo/bar) 來更改目錄。不需要提供完整的路徑,用戶就能更改位置,只要提供路徑的唯一子字符串,Zoxide 就能使用它的使用歷史記錄來引導到想要的位置。

爲了便於採用,我選擇使用 Zoxide 替換 cd,這就像在添加初始化 shell 代碼時使用 --cmd 標誌一樣簡單 (eval "$(zoxide init zsh --cmd cd)")。

ℹ️ 安裝 Zoxide

有許多方法可以安裝 Zoxide。比如說 brew:

brew install zoxide

並在你的 .zshrc, bashrc 或者類似的東西上加上 hooks:

eval "$(zoxide init zsh --cmd cd)"

GitUpdate

這個工具是在 Lobste.rs 上的另一個發現。在 Git 分支上工作時,我喜歡經常提交我的工作。

例如,在我試圖刪除博客文章中的一些巨大的文本塊之前,或者在我嘗試重構一些代碼片段之前,我會提交我的工作。

當然,我稍後會壓縮或重組這些提交,但爲了方便,我有一個名爲 wip(“工作在進行中”) 的 git 別名,這讓我的提交更輕鬆。

git wip = !git add --all; git ci -m WIP

Gitupdate 是對這個想法的一個簡單改進。

Gitupdate 可以提交文件,並使用更改文件的文件名 (而不是擴展名) 來創建更有意義的提交消息。當提交消息不重要時,它非常有用。 

GitUpdate 生成提交消息、提交和推送。

ℹ️ 安裝 GitUpdate

git clone https://github.com/nikitavoloboev/gitupdate
go build
sudo cp gitupdate /usr/local/bin

其他工具

還有許多其他有用的命令行工具,一篇文章不足以涵蓋這些內容。像是 JQ, mitmproxy, Pandoc,和 PSTree,都是非常優秀的工具。

當然,本文最初所發佈的網站:Earthly,本身就是一個命令行工具,可以和這些工具結合使用。以及一項用來整理散文的工具,都能更有效地提升你的工作效率。

你還有什麼工具推薦?歡迎下方留言,分享你的實用工具庫。

參考鏈接:

https://earthly.dev/blog/command-line-tools/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/LV5cLszM2sSdXPedOiPFBw