我不肯定有多少 Web 開發者能徹底避免使用命令行。就我來講,我從 1997 年上大學就開始使用命令行了,那時的 l33t-hacker 讓我着迷,同時我也以爲它很難掌握。html
過去這些年個人命令行本領在逐步增強,我常常會去搜尋工做中能用的更好的命令行工具。下面就是我如今使用的用於加強原有命令行工具的列表。node
一般狀況下我會用別名將新的加強的命令行工具覆蓋原來的命令(如 cat
和 ping
)。git
若是我須要運行原來的命令的話(有時我確實須要這麼作),我會像下面這樣來運行未加修改的原始命令。(我用的是 Mac,你的用法可能不同)github
$ \cat # 忽略叫 "cat" 的別名 - 具體解釋: https://stackoverflow.com/a/16506263/22617 $ command cat # 忽略函數和別名
cat
用於打印文件的內容,若是你平時用命令行不少的話,例如語法高亮之類的功能會很是有用。我首先發現了 ccat 這個有語法高亮功能的工具,而後我發現了 bat,它的功能有語法高亮、分頁、行號和 git 集成。正則表達式
bat
命令也能讓我在(多於一屏的)輸出裏使用 /
搜索(和用 less
搜索功能同樣)。shell
我將別名 cat
指到了 bat
命令:數據庫
alias cat='bat'
ping
很是有用,當我碰到「糟了,是否是 X 掛了?/個人網不通了?」這種狀況下我最早想到的工具就是它了。可是 prettyping
(「prettyping」 可不是指「pre typing」)在 ping
的基礎上加了友好的輸出,這可以讓我感受命令行友好了不少呢。npm
Sample ping outputjson
我也將 ping
用別名連接到了 prettyping
命令:vim
alias ping='prettyping --nolegend'
在終端裏,使用 ctrl+r
將容許你在命令歷史裏反向搜索使用過的命令,這是個挺好的小技巧,儘管它有點麻煩。
fzf
這個工具相比於 ctrl+r
有了巨大的進步。它能針對命令行歷史進行模糊查詢,而且提供了對可能的合格結果進行全面交互式預覽。
除了搜索命令歷史,fzf
還能預覽和打開文件,我在下面的視頻裏展現了這些功能。
爲了這個預覽的效果,我建立了一個叫 preview
的別名,它將 fzf
和前文提到的 bat
組合起來完成預覽功能,還給上面綁定了一個定製的熱鍵 ctrl+o
來打開 VS Code:
alias preview="fzf --preview 'bat --color \"always\" {}'" # 支持在 VS Code 裏用 ctrl+o 來打開選擇的文件 export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"
top
是當我想快速診斷爲何機器上的 CPU 跑的那麼累或者風扇爲何忽然呼呼大作的時候首先會想到的工具。我在生產環境也會使用這個工具。討厭的是 Mac 上的 top
和 Linux 上的 top
有着極大的不一樣(恕我直言,應該是差的多)。
不過,htop
是對 Linux 上的 top
和 Mac 上蹩腳的 top
的極大改進。它增長了包括顏色輸出,鍵盤熱鍵綁定以及不一樣的視圖輸出,這對理解進程之間的父子關係有極大幫助。
一些很容易上手的熱鍵:
P
—— 按 CPU 使用率排序M
—— 按內存使用排序F4
—— 用字符串過濾進程(例如只看包括 node 的進程)space
—— 錨定一個單獨進程,這樣我能觀察它是否有尖峯狀態
在 Mac Sierra 上 htop 有個奇怪的 bug,不過這個 bug 能夠經過以 root 運行來繞過(我實在記不清這個 bug 是什麼,可是這個別名能搞定它,有點討厭的是我得每次都輸入 root 密碼。):
alias top="sudo htop" # 給 top 加上別名而且繞過 Sierra 上的 bug
我很是肯定我是幾年前從 Paul Irish 那兒學來的這個技巧,儘管我不多直接使用 diff
,但個人 git 命令行會一直使用 diff
。diff-so-fancy
給了我代碼語法顏色和更改字符高亮的功能。
在個人 ~/.gitconfig
文件裏我用了下面的選項來打開 git diff
和 git show
的 diff-so-fancy
功能。
[pager] diff = diff-so-fancy | less --tabs=1,5 -RFX show = diff-so-fancy | less --tabs=1,5 -RFX
儘管我使用 Mac,但我毫不是 Spotlight 的粉絲,我以爲它的性能不好,關鍵字也難記,加上更新它本身的數據庫時會拖慢 CPU,簡直一無可取。我常用 Alfred,可是它的搜索功能也不是很好。
我傾向於在命令行中搜索文件,可是 find
的難用在於很難去記住那些合適的表達式來描述我想要的文件。(並且 Mac 上的 find
命令和非 Mac 的 find
命令還有些許不一樣,這更加深了個人失望。)
fd
是一個很好的替代品(它的做者和 bat
的做者是同一我的)。它很是快並且對於我常常要搜索的命令很是好記。
幾個上手的例子:
$ fd cli # 全部包含 "cli" 的文件名
$ fd -e md # 全部以 .md 做爲擴展名的文件
$ fd cli -x wc -w # 搜索 "cli" 而且在每一個搜索結果上運行 `wc -w`
對我來講,知道當前磁盤空間被什麼佔用了很是重要。我用過 Mac 上的 DaisyDisk,可是我以爲那個程序產生結果有點慢。
du -sh
命令是我常常會運行的命令(-sh
是指結果以「彙總」和「人類可讀」的方式顯示),我常常會想要深刻挖掘那些佔用了大量磁盤空間的目錄,看看究竟是什麼在佔用空間。
ncdu
是一個很是棒的替代品。它提供了一個交互式的界面而且容許快速的掃描那些佔用了大量磁盤空間的目錄和文件,它又快又準。(儘管無論在哪一個工具的狀況下,掃描個人 home 目錄都要很長時間,它有 550G)
一旦當我找到一個目錄我想要「處理」一下(如刪除,移動或壓縮文件),我會使用 cmd
+ 點擊 iTerm2頂部的目錄名字的方法在 Finder 中打開它。
還有另外一個叫 nnn 的替代選擇,它提供了一個更漂亮的界面,它也提供文件尺寸和使用狀況,實際上它更像一個全功能的文件管理器。
個人 du
是以下的別名:
alias du="ncdu --color dark -rr -x --exclude .git --exclude node_modules"
選項說明:
--color dark
使用顏色方案-rr
只讀模式(防止誤刪和運行新的 shell 程序)--exclude
忽略不想操做的目錄幾乎全部的命令行工具都有一個相伴的手冊,它能夠被 man <命令名>
來調出,可是在 man
的輸出裏找到東西可有點讓人困惑,並且在一個包含了全部的技術細節的輸出裏找東西也挺可怕的。
這就是 TL;DR 項目(LCTT 譯註:英文裏「文檔太長,沒空去讀」的縮寫)建立的初衷。這是一個由社區驅動的文檔系統,並且能夠用在命令行上。就我如今使用的經驗,我還沒碰到過一個命令沒有它相應的文檔,你也能夠作貢獻。
一個小技巧,我將 tldr
的別名連接到 help
(這樣輸入會快一點……)
alias help='tldr'
grep
毫無疑問是一個強力的命令行工具,可是這些年來它已經被一些工具超越了,其中兩個叫 ack
和 ag
。
我我的對 ack
和 ag
都嘗試過,並且沒有很是明顯的我的偏好,(也就是說它們都很棒,而且很類似)。我傾向於默認只使用 ack
,由於這三個字符就在指尖,很好打。而且 ack
有大量的 ack --bar
參數可使用!(你必定會體會到這一點。)
ack
和 ag
默認都使用正則表達式來搜索,這很是契合個人工做,我能使用相似於 --js
或 --html
這種標識指定文件類型搜索。(儘管 ag
比 ack
在文件類型過濾器裏包括了更多的文件類型。)
兩個工具都支持常見的 grep
選項,如 -B
和 -A
用於在搜索的上下文裏指代「以前」和「以後」。
由於 ack
不支持 markdown(而我又剛好寫了不少 markdown),我在個人 ~/.ackrc
文件里加瞭如下定製語句:
--type-set=md=.md,.mkd,.markdown --pager=less -FRX
我是 jq 的忠實粉絲之一。固然一開始我也在它的語法裏苦苦掙扎,好在我對查詢語言還算有些使用心得,如今我對 jq
能夠說是天天都要用。(不過從前我要麼使用 grep
或者使用一個叫 json的工具,相比而言後者的功能就很是基礎了。)
我甚至開始撰寫一個 jq
的教程系列(有 2500 字而且還在增長),我還發布了一個網頁工具和一個 Mac 上的應用(這個尚未發佈。)
jq
容許我傳入一個 JSON 而且能很是簡單的將其轉變爲一個使用 JSON 格式的結果,這正是我想要的。下面這個例子容許我用一個命令更新個人全部 node 依賴。(爲了閱讀方便,我將其分紅爲多行。)
$ npm i $(echo $(\ npm outdated --json | \ jq -r 'to_entries | .[] | "\(.key)@\(.value.latest)"' \ ))
上面的命令將使用 npm 的 JSON 輸出格式來列出全部過時的 node 依賴,而後將下面的源 JSON 轉換爲:
{ "node-jq": { "current": "0.7.0", "wanted": "0.7.0", "latest": "1.2.0", "location": "node_modules/node-jq" }, "uuid": { "current": "3.1.0", "wanted": "3.2.1", "latest": "3.2.1", "location": "node_modules/uuid" } }
轉換結果爲:
node-jq@1.2.0 uuid@3.2.1
上面的結果會被做爲 npm install
的輸入,你瞧,個人升級就這樣所有搞定了。(固然,這裏有點小題大作了。)
我也在開始嘗試一些別的工具,但我尚未徹底掌握它們。(除了 ponysay
,當我打開一個新的終端會話時,它就會出現。)