寫給小白的第一份命令行工具Bash教程
這是一枚屬於拖稿很久的「面向小白的 Python 教程」系列的彩蛋。
作為一個編程小白,你是不是見過其他程序員電腦屏幕上這樣花花綠綠的窗口以及一雙在鍵盤上飛快跳躍自帶重影的手?
圖片:pexels.com
徘徊半天不好意思開口問對方窗口裡的那些命令是什麼,暗暗希望自己有一天也能把屏幕搞得如此神秘炫酷?
——你需要一篇優秀程序員必備的命令行工具教程!
近看 Bash
關於命令行(command line)工具和終端(terminal)的概念,我們在「Python 教程」的開篇就簡單介紹過了:
一開始對於 Terminal 這個東西理解困難的讀者,可以把它想像成一個殼(shell),在這個殼裡,你可以寫命令(command),這些命令直接發給電腦,電腦收到特定命令會執行特定行為,比如打開、編輯、刪除文檔。
而 Terminal 只是承載了這個殼(命令行工具)的 APP 的名字。你還可以像我一樣下載其他類似的 APP,比如很多程序員都愛用的 iTerm (https://www.iterm2.com),功能更加強大。
當時我只說了這個可以寫命令的 APP 的名字,為了不讓小白產生混淆,沒提主流命令行工具的本名 —Bash。Bash 的維基百科定義是,
Bash is aUnix shellandcommand languagewritten by Brian Fox […] as a free software replacement for the Bourne shell.
— Wikipedia
實際上 Bash 這個名稱就是Bourne-again shell的首字母縮略詞,而 Bourne shell 從維基的定義中可以看出是 Bash 的前身,即另一個(有點過時的)命令行工具。
Bash 是 Unix (Linux + macOS) 操作系統(operating system)的默認命令行工具。也就是說,只要你手邊的計算機是蘋果電腦或 Linux 系統電腦,那打開 Terminal 後就自動進入了 Bash 的環境。
WIndows 10 用戶現在有了從微軟官方下載安裝正經 Linux 雙系統的選項!如果你短期內不打算換到 Unix 操作系統的電腦,又想提前感受更加敏捷流暢的開發體驗,不妨試試這條途徑。
我把相關官網鏈接放在文末了。
現在,可以點擊用 Spotlight 呼出 Terminal / iTerm 了。
Bash 入門
在 Terminal 窗口中,我們跟計算機直接交流的(編程)語言就是 Bash。
Bash 指令有點像 Python 函數(functions)。
一個 Bash 指令 = 關鍵詞(keyword)[+ 一個空格 + 某個/些參數(parameter)];
最後不要忘了點擊鍵才能看到運行結果。
先來試一個非常簡單直觀的 Bash 指令:
(代碼框內符號後面的才是 Bash 代碼,下同)
你看到什麼回應了嗎?
——這個名叫的指令是不是和我們熟悉的 Python語句差不多?
Bash 有些指令或許看起來複雜,但實質上和這行語句的語法本質是差不多的。
相對路徑與絕對路徑
前文提到了操作系統(operating system)這個詞,那操作系統到底指的是什麼呢?
某種程度上,我們可以把操作系統看作一台電腦里目錄(directories,即文件夾 folders 的另一稱呼)與文件(files)的組合。任何一個目錄或文件都自帶一個路徑(path),表示其在操作系統中的地址——就像可以通過網址找到對應的網站一樣。當你在使用 Bash 時,你總是在某個有特定路徑的目錄下;想知道目前所在的目錄或路徑可以輸入這個 Bash 指令:
是 present working directory 的縮寫;working directory 是指你(在 Terminal 里)目前所在的操作目錄。比如,我現在的路徑和操作目錄就可以在下面輸出結果中看到:
(路徑表示方式是不是和網址很像 :)
所有目錄以「樹(tree)」的結構呈現。「樹」在計算機科學中是個重要概念,是一種數據結構,以後我們還會反覆遇到。
為什麼說電腦里所有目錄構成「樹」呢?看看下面的目錄結構解剖圖就懂了:
在這棵倒立的樹的每個分支處都是一個目錄,樹根有一個唯一的根目錄(root),從根目錄可以延伸出無數子目錄,每個子目錄的路徑都可以非常清晰地從這棵樹上看到。比如,english 子目錄的路徑就是;表示 root。
知道了路徑表示目錄或文件在操作系統中地址,就可以不點開 Finder/文件管理器 這類圖形界面,在 Terminal 中直接訪問目標文件夾或文件。
在 Unix 操作系統中有兩種描述路徑的方式:絕對路徑(absolute path)與相對路徑(relative path)。
絕對路徑即為從根目錄出發的的路徑,比如前文的例子。
相對路徑則是相對於目前所在目錄位置的路徑。舉個例子,如果我目前在 carol 這個目錄里,想去訪問 english 子目錄,那相對路徑只需從 carol 出發,表示為即可。
Navigating in Bash
知道怎麼寫路徑了,就可以用這個 Bash 指令關鍵詞訪問相應路徑。比如,
為 change directory (更換目錄) 的縮寫。
為 root directory 的表示方式,前文提到了。
為 home directory 的表示方式,這個半形波浪符號的英文名是 tilde。
表示退回到上一級目錄,所以這裡又回到 carol 了。
頻繁與交替使用的一個指令是,可以列出當前目錄下所有子目錄與文檔(這樣你才知道能夠到哪個目錄去):
為 list directories 縮寫。
此外還可以創建一個新目錄(即創建新文件夾),用關鍵詞,加上新目錄名字這個參數。如,
為 make directory 的縮寫。
創建了新目錄後可以用查看是否創建成功。思維方式依然強烈依賴圖形界面的同學,可以打開相對應的文件夾,你會看到一個新的文件夾靜靜地躺在那兒。
刪除一個目錄用:
是 remove directory 的縮寫。
用 Bash 取代 Finder / 資源管理器
我現在已經記不太清如何在 Windows 電腦上新建文檔或搜索文件夾內內容了,因為我有了 Bash :p
下面讓我來介紹下如何用 Bash 相關小工具更快更優雅地完成所有你在 Finder / 資源管理器內能夠進行與無法進行的常用操作。
新建、刪除文檔
在合適的目錄下輸入:
看一眼 Finder,或接著輸入指令,是不是能看到一個名為「sinan-talk」的 txt 空白文檔?用指令新建任意文檔就是這麼簡單。
刪除一個文檔可以:
即為 remove 縮寫。
還可以用來重命名文檔,使用方法如下:
刪除掉的文檔或文件夾不會出現在垃圾桶中,小白請慎用。
預覽文檔內容
找一個內容的文檔,在其目錄下輸入:
是 Markdown 格式文檔的擴展名。
此時你會看到 Terminal 窗口變成了 sinan-talk.md 這個文檔內容的預覽窗口。這個功能是實現的。
退出預覽點擊。
除了文字文檔外,還有很多文件類型都能直接在 Terminal 預覽,比如音頻文件(但需要多走一步安裝其他類似的小工具)。
查看文檔內容,合併文檔
查看文檔內容除了用指令外,還常用到。不會跳到預覽界面,而會把文檔內容直接返回。比如,
除此之外,還可以用來做簡單拼接文檔的工作。比如,
本身是 concatenate(串聯)的縮寫,即「首尾相連接在一起」。
這裡涉及到這個符號。雖然是半形大於號,但在 Bash 腳本中常可以把看作用於指向的箭頭。里很形象地指向了一個保存拼接內容的文檔名稱。
這裡的既可以是先前不存在的文檔(電腦會即時創建這個新文檔);也可以是已經存在的文檔(但此步操作會覆蓋掉文檔中原有內容)。
查看文檔大小、長度、字數
這個需求也非常常見。用這個小工具即可快速查看各種大小參數。
是 wordcount 縮寫。
這個指令可以配不同的選項(options, 也稱 flags)。通過明確不同的選項,可以分別查看文檔的字數、行數、位元組數。具體如下:
位元組數
行數
字數
例如:
不想瀏覽長文檔的全部內容…
在程序員的日常中常常需要處理很大的文檔(成千上萬行內容或更多),這種時候沒有正常人會直接打開這個文檔(因為太慢,或有些編輯器不支持,或太佔用電腦的 working memory),也不便於在命令行直接瀏覽。此時有個只瀏覽前 N 行的小指令就非常方便了。
這種情況下我們可以使用指令。
緊跟的數字選項是你想查看的前 N 行內容。前 10 行即為.
配上上面剛學到的,還可以非常方便地選中文檔前 N 行內容並單獨保存到另一個新文檔中。
這樣就不用在文檔之間跳來跳去地反覆「複製粘貼」啦。
用文本編輯器打開文檔
這個指令就很簡單啦!如果我想用 Atom 或 SublimeText 這兩個主流文本編輯器打開一個文檔以便進一步編輯,可以這樣:
此時會跳出相應的應用界面。
如果想一次性打開此目錄下所有文檔,可以用表示:
(以上操作的前提是你已經下載安裝了 Atom 或 SublimeText,否則請看第一篇)
其他可以一秒上手的 Bash 小技巧
Tab Complete
各種指令、目錄名、文檔名手動敲來敲去會讓人很快失去耐心。當你寫 Bash 指令寫到一半時,可以單擊 Tab 鍵,Terminal 會嘗試自動補全你的指令。
比如,你輸入, 再點擊 Tab,會被補全為。
Tab 還可以用來補全目錄名稱與文檔名稱,但前提是你已經輸入了一半的名稱在當前目錄下無歧義,否則 Terminal 沒法幫你精準地偷懶。
Terminal 內不能用滑鼠改變游標位置,因此改變游標輸入位置對於新手來說會是件可能會把人逼瘋的事。但你只要記住以下四個快捷鍵組合就可以相對迅速地在指令中跳來跳去修改內容。
- 跳到前一個詞
- 跳到後一個詞
- 跳到開頭
- 跳到末尾
還有更多「高級」指令可以做到更多,比如交換游標前兩個單詞的位置等等。在這兒就先不詳述了。
單擊鍵盤上的 鍵。可多次點擊回溯舊指令。
在 Python console 中也適用。
讓 vim 承包文檔編輯任務
早在 Python 第一節,我就已經簡單介紹過「工程師的文本編輯器 (text editor)」了,但當時我們著重介紹的 Atom 和 SublimeText 依然存在圖形界面。今天我們要學著使用一款丟掉外殼,直接從 Terminal 進入文本編輯模式的編輯神器——vim。
vim 功能十分強大,如果你能熟練運用,這絕對是大大提高你工作效率(和炫酷程度)的程序員工具。但 vim 和 Bash 本身一樣,對從沒接觸過的人來說,理解起來需要一定時間,學習曲線一開始會有點陡峭。這也是為什麼當你在谷歌上搜索「vim tutorial」時會瞬間跳出無數結果……
想知道如何用 vim,可以直接在 Terminal 內輸入:
這是個完整的 vim 教程,帶詳細說明和練習,有空可以慢慢敲完。
我是那種走一遍教程也記不全的人,所以喜歡下載、手寫一些 cheatsheets 幫助記憶。你也可以試試。
(蘋果電腦一般自帶 vim,Linux 可能要自裝)
小結
認真跟下來這篇 Bash 教程的小夥伴想必會忍不住讚美一下這個強大又炫酷的開發工具了吧。
總結一下各類程序員開發工具的精神就是:偷懶,炫酷,偷更多懶。
Bash 一開始學習曲線會相對陡峭,但說到底還是能否下決定搞熟練的問題。練習直到形成肌肉記憶,是條踏實的捷徑。畢竟,長遠看來 Bash 會為你的開發生涯節約無窮無盡的時間,讓你把那些時間留下給思考更重要的問題。
Work smarter, not harder!
資源區
Win10 安裝 Linux 雙系統,官網指引:
https://docs.microsoft.com/en-us/windows/wsl/install-win10
萬能的 Bash (shell) 指令查詢網站:https://explainshell.com
你也許還想繼續讀……
謝謝你的閱讀
喜歡的話來關注、留言我呀
TAG:影子練習SinanTalk |