Linux 命令列下的好東西

視學演算法發表於2020-04-06

來自:簡書 作者:jagttt

原文連結:

http://www.jianshu.com/p/5ca890e5bdbf

為你列舉一些可能沒注意過的好用的 Linux 命令列命令。

現在做網站做移動應用最講究的就是推廣了,推廣做的好那就成功了一大半,相對的沒曝光產品再好也很難做下去。就這個角度而言絕大多數 Linux 命令列的推廣簡直是爛透了。繁多 Linux 有用極了的命令列工具就靜靜的躺在你發行版預設安裝的包裹裡,很多時候只有當你碰到什麼問題的時候網上搜一圈才能知道。更蛋疼的是這裡面很多東西你一旦知道了就會想我靠原來沒這個到底是怎麼過的下去。所以這裡我會列出一些我用過的一些,大部分發行版預設就有,或者能用包裹管理工具輕鬆獲取的東西。

這篇文章僅討論 Linux 環境下的東西,很顯然對 MacOS 也適用。其實很多東西雖然有 Windows 也可以找的到但配置比較麻煩,這裡不再仔細講。很多東西像 Linux 老鳥看起來會覺得哈哈哈實在是太基礎。但是像 cd, ls, mkdir 這些太基礎的寫在這裡又顯得太業餘,所以很多十分常用的命令這邊我也跳過了。像 git 這種重量級的工具,和 sed, awk 這些能單獨出書的東西我覺得我也講不清楚,所以這邊都是功能簡單的小東西。不過這些小問題就算了吧...

如果你時間比較充裕

...那麼不如看看這本書吧: <<The Linux Command Line\>>。書的內容就跟標題一樣,深入淺出的介紹了所謂 "Linux 命令列" 的方方面面,本文很多內容也是從書裡看到的。網站上有 PDF 合法免費下載,書寫的很好可以很隨意的看不會覺得壓力太大。最主要的,如果你是剛剛接觸 Linux 那麼這個說不定是最好的上手教程,我十分後悔原來不知道這麼書。這麼說起來另外一本 Linux 入門大師級教程應該是鳥哥私房菜,這個實在是太出名以至於我覺得沒什麼可以說的。

如果你沒什麼空的話

那下面就以隨機的順序列出一些我覺得非常棒的命令列工具。這裡不詳細介紹各種引數,你應該做的是用 man xxx 來檢視文件。如果這些程式在你的發行版裡沒有安裝,那麼請手動搜一下。Mac 使用者的話在 homebrew 裡可以應該都能找到。

tmux

雖然說順序很隨機但這一條一定得排在第一個。很多人用 Linux 的狀態都是自己的機器是 Windows,用 putty 連到一個哪裡的 Linux 伺服器進行工作。這樣的話每次斷開的時候你執行的程式都是會被殺掉的。你可能會希望退出的時候能把開啟的程式保持在那裡,下次用連線的時候又能自動到之前的工作狀態。tmux 就是這個問題的終極解決方案。它們一方面的功能是能在一個 Terminal 裡建立多個“視窗”,另一方面如果你關閉連線或者意外掉線,它們預設也不會關掉,下次連上去可以用 tmux attach 來恢復你之前的工作狀態。

如果你沒聽說過這個或者類似的 screen 的話,那你應該給我一點現金。


tree

ls 可能是你最常用的命令之一。tree 可以遞迴的列出目錄下所有的檔案,並以樹狀形式展現:

$ tree  
.  
├── b  
├── c  
│   └── d  
└── what

對應的也有 pstree 可以以這樣的方式來顯示程式樹。

ack

我記得我曾經在面試的時候被問到過“請寫如何呼叫 grep 來列出當前目錄下所有檔案裡,含有某個字串的行”。這個問題我的回答是 “用 ack 就可以了”。ack 的官網域名就叫 betterthangrep.com。由於在當前目錄下載所有檔案裡查詢某個字串符是如此常見的一個操作,執行 ack foo 就可以在當前目錄所有檔案裡查詢 foo。ack 預設會跳過很多沒用的目錄和檔案,讓查詢更快,輸出結果更準確。另外像預設開啟的彩色顯示也讓人用起來很舒暢。

ack 目前大部分發行版中沒有,如果你使用的是 Ubuntu 的話其包裹名字是 ack-grep,執行檔案的名字也一樣。具體可以在這裡檢視文件。

rsync

比如說你本地有一臺電腦,遠端有一臺伺服器。你想把你的一個資料夾全部拷貝到另外一邊的某個地方去。你這個資料夾經常也要更新,希望通過某種方式把更新的部分能迅速同步過去。這應該怎麼做?不知道 rsync 的話你可能會想用 git,搭建一個 ftp,或者用 scp 或者別的。但事實上 rsync 才是真正的為精確的解決這個問題而生的軟體。rsync 最棒的地方就是差量更新,也就是隻把另外一邊缺少的東西傳過去,而且你不需要任何額外配置,速度快的飛起。一個例子:

rsync -arvuzp --chmod=g+rx ./built/ me@example.com:/var/www/site

aspell

作為一個程式設計師你總有一天會要寫英文文件。我等母語不是英文的出現拼寫錯誤實在是太正常了。如果你用 Word 的話會有下劃線提示你,但如果你是在程式碼裡寫註釋或者再 Linux 下寫 markdown 的話好像就沒什麼辦法。事實上這也是一個已經被解決的問題,aspell 正是來做這個的。aspell 可以對任何純文字進行拼寫檢查,作為面向程式設計師的工具它可以偵測檔案型別,比如對 C++ 程式它就只檢查註釋裡的單詞。

tee

有時候某些命令執行的結果會很長,你可能會用 less 來上下看。再或者你可能會用 > 來重定向到檔案裡。但某些時候程式有可能需要你輸入 y 來確認,或者某些程式執行的時間很長,僅僅重定向的話又不太確定是不是它在正常執行。tee 就能做到又輸出到螢幕上,又同時重定向到檔案。一個簡單的例子:

$ echo waht | tee out.txt

waht 會被輸出到螢幕上,同時也會被寫到 out.txt 檔案裡。另外 tee 的意思其實是 T,把輸入輸出中間拉了又多扯出了一條,可謂是相當形象。

值得一提的是 vim 也可以用在 pipe 裡,例子如下:

$ echo waht | vim -

<ctrl+r\>

你肯定知道用鍵盤上下方向鍵可以來回找你的歷史,那麼比如有一個很久之前打過的命令你可能需要猛按上才能找到。其實這時候只要輸入一部分然後按 <ctrl+r\> bash 就會幫你往回搜尋。連續按 <ctrl+r\> 可以按順序往前搜。(或者直接按 <ctrl+r\> 再進行輸入)。接著上面一個的例子,輸入 echo 後按 <ctrl+r\> 效果如下:

(reverse-i-search)`echo': echo waht | vim -

有往前搜尋那麼一般就有往後搜尋。可惜的是往後搜尋的快捷鍵是 <ctrl+s\>,如果你試著按一下的就會發現...好像機器沒反應了。這個是因為 <ctrl+s\> 大部分情況下預設是 XOFF,代表暫停接收輸入。按 <ctrl+q\> 就能恢復。當然你可以把向前搜尋繫結到別的鍵上,請自行搜尋。

cloc

雖說程式碼行數不能說明任何問題,但有時候不知為什就是想知道。cloc 能精確的計算程式碼行數,把註釋和空格都區分開。如果你是一名傳說中的專案經理的話,從今天起開始用 cloc 給你手下的碼農算工資吧!下附截圖:

$ cloc /usr/include/  
    9628 text files.  
    9308 unique files.  
     434 files ignored.  

T=39.0 s (227.6 files/s, 39948.2 lines/s)  
-------------------------------------------------  
Language        files    blank  comment      code  
-------------------------------------------------  
C/C++ Header     8875   217366   287013   1053368  
Teamcenter def      1       48        0       186  
-------------------------------------------------  
SUM:             8876   217414   287013   1053554  
-------------------------------------------------

printenv

用 set 可以檢視所有的 Shell 變數還包括 Shell 函式,但是其中有一些是僅僅在當前 shell 裡其作用的。而往往你需要找的是通過 export 來定義的環境變數。printenv 就是用來做這個的。


set -o vi

bash 或者可能絕大多數常見 shell 其實都是支援用 vi 的方式進行命令列編輯的,比如設定了 set -o vi 後你就可以用熟悉的 hjkl 來移動,用 w, b 來跳過單詞等等。

同樣的如果你設定了 EDITOR 環境變數的話,輸入 fc 就可以把之前輸入的命令列放到編輯器裡來編輯,只要儲存了的話就會執行。相反的放棄儲存就等於是放棄。

find

我把上面說到的那本書仔細看過以後,最大的收穫之一就是終於學會了用 find。這個現在變成了我幾乎每天都在用的一個命令。比如說我要把目錄下所有的 png 檔案加入到這次的 git commit 裡面,我可以用:

find . -name '*.png' -exec git add {} ';'

如果你熟悉 find 的話你會知道最後的 ; 可以換為 + 會更好,但用它就是有目的的。這個命令雖然看起來很簡單,但裡面的單引號省略或者換成雙引號命令都是會失敗的。這些牽涉到 "shell variable expansion" 和引號的 escape 規則,雖然感覺很惱火但其實這些只有幾個簡單的規則,而且一致性非常好。所以只要你肯花點時間把相關東西弄清楚,這種簡單的問題就可以輕鬆搞定。

type

如果 foo 是一個命令列裡可以直接執行的程式的話,你應該知道用 which foo 可以找到 foo 的可執行檔案路徑在那裡。但在命令列裡可以執行的命令並不一定都對應到某個可執行的檔案,它可以是 alias, shell 自帶的函式和使用者自己的函式等等。所以有時候用 which 找到不到東西的時候會讓人很疑惑。其實你可以用 type foo 看看 foo 到底是什麼型別的。

help

上面提到了 "builtin command" 也就是內建命令,就是由 shell 提供的一些基本的或者無法由外部程式做到的命令。平常你可以用 man 來檢視文件,但是對於內建命令 man 會跳到 shell 自己的 manpage,在某些系統裡那就是巨大的一頁你要再裡面找到你想看的東西,有些系統裡乾脆就沒有相關的資訊。這種時候用 help 這個內建命令就可以解決這個問題:比如要檢視 set 的接受的選項,可以用 help set 來輕鬆找到。

env

你應該知道在 #! (shebang) 在指令碼第一行的作用是指定其 'runtime'。比如說你想要寫一個 Python 的指令碼,但其實不太在意其版本,或者不確定其可執行檔案在不同的機器上到底在哪裡。那麼 env 在這裡就可以派上用場了。可以寫成 #!/usr/bin/env python,這樣執行的時候就會用當前 PATH 中找到的 python。另一方面這個也是一個給你一個在不修改程式碼的情況下,重新選擇 'runtime' 的機會。

file

如果你想知道某個路徑上的檔案到底是什麼型別的,那麼用 file 是再合適不過的了。它能對任何東西都給出一個有意義的解釋,對於二進位制檔案還會列出很多相關的重要資訊。

strings

“我把我的祕密,放在了這個用 C++ 編寫的程式裡面。執行它輸入正確的密碼才能看到”。其實萬一遇到這種情況你只要跑 strings program-written-in-cxx 十有八九你就能看到了。它能比較準確的列出二進位制檔案裡包含的 C 風格的字串。看起來沒什麼意義但是其實作用完全要靠你發揮,比如要知道某個程式是哪個版本 GCC 編譯出來的用 strings 可能有結果。

od


全程應該是 "object dump",可以將檔案按八進位制,十六進位制或者其他方式顯示出來。我覺得大部分情況下這大家都在用 od -c,將檔案按 ASCII 碼 dump 出來。一個用例是用來看檔案的 line ending 到底是怎樣的。比如執行 od -c foo.txt 顯示如下結果:

$ od -c foo.txt  
0000000   h   e   l   l   o  \t   w   o   r   l   d  \r  \n   y   e   a  
0000020   h  
0000021

可以清楚的看到 \t 是 tab 字元, \r\n 是 Windows 風格的換行符。

- END -

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板向我私聊「進群」二字即可進入高質量交流群。

掃描二維碼進群↓

Linux 命令列下的好東西

Linux 命令列下的好東西

Linux 命令列下的好東西

在看 Linux 命令列下的好東西

相關文章