1. 程式人生 > >命令列:增強版 | Linux 中國

命令列:增強版 | Linux 中國

640?wx_fmt=jpeg下面就是我現在使用的用於增強原有命令列工具的列表。-- Remy Sharp有用的原文連結請訪問文末的“原文連結”獲得可點選的文內連結、全尺寸原圖和相關文章。致謝編譯自 | https://remysharp.com/2018/08/23/cli-improved  作者 | Remy Sharp 譯者 | DavidChenLiang ??共計翻譯:8.0 篇 貢獻時間:94 天

我不確定有多少 Web 開發者能完全避免使用命令列。就我來說,我從 1997 年上大學就開始使用命令行了,那時的 l33t-hacker 讓我著迷,同時我也覺得它很難掌握。

過去這些年我的命令列本領在逐步加強,我經常會去搜尋工作中能用的更好的命令列工具。下面就是我現在使用的用於增強原有命令列工具的列表。

怎麼忽略我所做的命令列增強

通常情況下我會用別名將新的增強的命令列工具覆蓋原來的命令(如 cat 和 ping)。

如果我需要執行原來的命令的話(有時我確實需要這麼做),我會像下面這樣來執行未加修改的原始命令。(我用的是 Mac,你的用法可能不一樣)

  1. $ \cat #忽略叫"cat"的別名-具體解釋: https://stackoverflow.com/a/16506263/22617

  2. $ command cat#忽略函式和別名

bat > cat

cat 用於列印檔案的內容,如果你平時用命令列很多的話,例如語法高亮之類的功能會非常有用。我首先發現了 ccat[1] 這個有語法高亮功能的工具,然後我發現了 bat

[2],它的功能有語法高亮、分頁、行號和 git 整合。

bat 命令也能讓我在(多於一屏的)輸出裡使用 / 搜尋(和用 less 搜尋功能一樣)。

640?wx_fmt=gif

Sample bat output

我將別名 cat 指到了 bat 命令:

  1. aliascat='bat'

◈ 安裝指引[2]

prettyping > ping

ping 非常有用,當我碰到“糟了,是不是 X 掛了?/我的網不通了?”這種情況下我最先想到的工具就是它了。但是 prettyping(“prettyping” 可不是指“pre typing”)在 ping 的基礎上加了友好的輸出,這可讓我感覺命令列友好了很多呢。

640?wx_fmt=gif

Sample ping output

我也將 ping 用別名連結到了 prettyping 命令:

  1. aliasping='prettyping --nolegend'

◈ 安裝指引[3]

fzf > ctrl+r

在終端裡,使用 ctrl+r 將允許你在命令歷史裡反向搜尋[4]使用過的命令,這是個挺好的小技巧,儘管它有點麻煩。

fzf 這個工具相比於 ctrl+r 有了巨大的進步。它能針對命令列歷史進行模糊查詢,並且提供了對可能的合格結果進行全面互動式預覽。

除了搜尋命令歷史,fzf 還能預覽和開啟檔案,我在下面的視訊裡展示了這些功能。

為了這個預覽的效果,我建立了一個叫 preview 的別名,它將 fzf 和前文提到的 bat組合起來完成預覽功能,還給上面綁定了一個定製的熱鍵 ctrl+o 來開啟 VS Code:

  1. alias preview="fzf --preview 'bat --color \"always\" {}'"

  2. #支援在 VS Code裡用 ctrl+o 來開啟選擇的檔案

  3. export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"

◈ 安裝指引[7]

htop > top

top 是當我想快速診斷為什麼機器上的 CPU 跑的那麼累或者風扇為什麼突然呼呼大做的時候首先會想到的工具。我在生產環境也會使用這個工具。討厭的是 Mac 上的 top 和 Linux 上的 top 有著極大的不同(恕我直言,應該是差的多)。

不過,htop 是對 Linux 上的 top 和 Mac 上蹩腳的 top 的極大改進。它增加了包括顏色輸出,鍵盤熱鍵繫結以及不同的檢視輸出,這對理解程序之間的父子關係有極大幫助。

一些很容易上手的熱鍵:

◈ P —— 按 CPU 使用率排序◈ M —— 按記憶體使用排序◈ F4 —— 用字串過濾程序(例如只看包括 node 的程序)◈ space —— 錨定一個單獨程序,這樣我能觀察它是否有尖峰狀態

640?wx_fmt=jpeg

Sample htop output

在 Mac Sierra 上 htop 有個奇怪的 bug,不過這個 bug 可以通過以 root 執行來繞過(我實在記不清這個 bug 是什麼,但是這個別名能搞定它,有點討厭的是我得每次都輸入 root 密碼。):

  1. aliastop="sudo htop"#top加上別名並且繞過Sierra上的 bug

◈ 安裝指引[8]

diff-so-fancy > diff

我非常確定我是幾年前從 Paul Irish 那兒學來的這個技巧,儘管我很少直接使用 diff,但我的 git 命令列會一直使用 diffdiff-so-fancy 給了我程式碼語法顏色和更改字元高亮的功能。

640?wx_fmt=jpeg

Sample diff output

在我的 ~/.gitconfig 檔案裡我用了下面的選項來開啟 git diff 和 git show 的 diff-so-fancy 功能。

  1. [pager]

  2. diff=diff-so-fancy |less--tabs=1,5-RFX

  3.    show =diff-so-fancy |less--tabs=1,5-RFX

◈ 安裝指引[9]

fd > find

儘管我使用 Mac,但我絕不是 Spotlight 的粉絲,我覺得它的效能很差,關鍵字也難記,加上更新它自己的資料庫時會拖慢 CPU,簡直一無是處。我經常使用 Alfred[10],但是它的搜尋功能也不是很好。

我傾向於在命令列中搜索檔案,但是 find 的難用在於很難去記住那些合適的表示式來描述我想要的檔案。(而且 Mac 上的 find 命令和非 Mac 的 find 命令還有些許不同,這更加深了我的失望。)

fd 是一個很好的替代品(它的作者和 bat 的作者是同一個人)。它非常快而且對於我經常要搜尋的命令非常好記。

幾個上手的例子:

  1. $ fd cli #所有包含"cli"的檔名

  2. $ fd -e md #所有以.md 作為副檔名的檔案

  3. $ fd cli -x wc-w#搜尋"cli"並且在每個搜尋結果上執行`wc -w`

640?wx_fmt=png

Sample fd output

◈ 安裝指引[11]

ncdu > du

對我來說,知道當前磁碟空間被什麼佔用了非常重要。我用過 Mac 上的 DaisyDisk[12],但是我覺得那個程式產生結果有點慢。

du -sh 命令是我經常會執行的命令(-sh 是指結果以“彙總”和“人類可讀”的方式顯示),我經常會想要深入挖掘那些佔用了大量磁碟空間的目錄,看看到底是什麼在佔用空間。

ncdu 是一個非常棒的替代品。它提供了一個互動式的介面並且允許快速的掃描那些佔用了大量磁碟空間的目錄和檔案,它又快又準。(儘管不管在哪個工具的情況下,掃描我的 home 目錄都要很長時間,它有 550G)

一旦當我找到一個目錄我想要“處理”一下(如刪除,移動或壓縮檔案),我會使用 cmd + 點選 iTerm2[13] 頂部的目錄名字的方法在 Finder 中開啟它。

640?wx_fmt=png

Sample ncdu output

還有另外一個叫 nnn 的替代選擇[14],它提供了一個更漂亮的介面,它也提供檔案尺寸和使用情況,實際上它更像一個全功能的檔案管理器。

我的 du 是如下的別名:

  1. aliasdu="ncdu --color dark -rr -x --exclude .git --exclude node_modules"

選項說明:

◈ --color dark 使用顏色方案◈ -rr 只讀模式(防止誤刪和執行新的 shell 程式)◈ --exclude 忽略不想操作的目錄◈ 安裝指引[15]

tldr > man

幾乎所有的命令列工具都有一個相伴的手冊,它可以被 man <命令名> 來調出,但是在 man的輸出裡找到東西可有點讓人困惑,而且在一個包含了所有的技術細節的輸出裡找東西也挺可怕的。

這就是 TL;DR 專案(LCTT 譯註:英文裡“文件太長,沒空去讀”的縮寫)建立的初衷。這是一個由社群驅動的文件系統,而且可以用在命令列上。就我現在使用的經驗,我還沒碰到過一個命令沒有它相應的文件,你也可以做貢獻[16]

640?wx_fmt=png

Sample tldr output for fd

一個小技巧,我將 tldr 的別名連結到 help(這樣輸入會快一點……)

  1. alias help='tldr'

◈ 安裝指引[17]

ack || ag > grep

grep 毫無疑問是一個強力的命令列工具,但是這些年來它已經被一些工具超越了,其中兩個叫 ack 和 ag

我個人對 ack 和 ag 都嘗試過,而且沒有非常明顯的個人偏好,(也就是說它們都很棒,並且很相似)。我傾向於預設只使用 ack,因為這三個字元就在指尖,很好打。並且 ack 有大量的 ack --bar 引數可以使用!(你一定會體會到這一點。)

ack 和 ag 預設都使用正則表示式來搜尋,這非常契合我的工作,我能使用類似於 --js或 --html 這種標識指定檔案型別搜尋。(儘管 ag 比 ack 在檔案型別過濾器裡包括了更多的檔案型別。)

兩個工具都支援常見的 grep 選項,如 -B 和 -A 用於在搜尋的上下文裡指代“之前”和“之後”。

640?wx_fmt=png

Sample ack output with grep args

因為 ack 不支援 markdown(而我又恰好寫了很多 markdown),我在我的 ~/.ackrc 檔案里加了以下定製語句:

  1. --type-set=md=.md,.mkd,.markdown

  2. --pager=less-FRX

◈ 安裝指引:ack[18]ag[19]◈ 關於 ack & ag 的更多資訊[20]

jq > grep 及其它

我是 jq[21] 的忠實粉絲之一。當然一開始我也在它的語法裡苦苦掙扎,好在我對查詢語言還算有些使用心得,現在我對 jq 可以說是每天都要用。(不過從前我要麼使用 grep 或者使用一個叫 json[22] 的工具,相比而言後者的功能就非常基礎了。)

我甚至開始撰寫一個 jq 的教程系列(有 2500 字並且還在增加),我還發布了一個網頁工具[23]和一個 Mac 上的應用(這個還沒有釋出。)

jq 允許我傳入一個 JSON 並且能非常簡單的將其轉變為一個使用 JSON 格式的結果,這正是我想要的。下面這個例子允許我用一個命令更新我的所有 node 依賴。(為了閱讀方便,我將其分成為多行。)

  1. $ npm i $(echo $(\

  2.    npm outdated --json | \

  3.    jq -r 'to_entries | .[] | "\(.key)@\(.value.latest)"' \

  4. ))

上面的命令將使用 npm 的 JSON 輸出格式來列出所有過期的 node 依賴,然後將下面的源 JSON 轉換為:

  1. {

  2. "node-jq":{

  3. "current":"0.7.0",

  4. "wanted":"0.7.0",

  5. "latest":"1.2.0",

  6. "location":"node_modules/node-jq"

  7. },

  8. "uuid":{

  9. "current":"3.1.0",

  10. "wanted":"3.2.1",

  11. "latest":"3.2.1",

  12. "location":"node_modules/uuid"

  13. }

  14. }

轉換結果為:

  1. node-[email protected].2.0

  2. [email protected].2.1

上面的結果會被作為 npm install 的輸入,你瞧,我的升級就這樣全部搞定了。(當然,這裡有點小題大做了。)

很榮幸提及一些其它的工具

我也在開始嘗試一些別的工具,但我還沒有完全掌握它們。(除了 ponysay,當我開啟一個新的終端會話時,它就會出現。)

◈ ponysay[24] > cowsay◈ csvkit[25] > awk 及其它◈ noti[26] > display notification◈ entr[27] > watch

你有什麼好點子嗎?

上面是我的命令列清單。你的呢?你有沒有試著去增強一些你每天都會用到的命令呢?請告訴我,我非常樂意知道。

via: https://remysharp.com/2018/08/23/cli-improved

作者:Remy Sharp[29] 選題:lujun9972 譯者:DavidChenLiang 校對:pityonlinewxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出