什麼是終端?
我們總在說在終端中如何操作,那麼終端到底是什麼呢?爲什麼它會有這麼大的權利?
要說清終端是什麼,我們先來看看操作系統的組成。簡化來說,操作系統分爲兩個部分,一部分稱作內核,另一部分成爲用戶交互界面。內核部分負責系統的全部邏輯操作,由海量命令組成,這一部分是系統運行的命脈,不與用戶接觸;交互界面則是開機之後所有我們所看到的東西,比如窗口,軟件,應用程序等等。
那麼我們若我們想對系統內核的某些操作邏輯做出一些修改,應該怎麼辦呢?終端就是連接內核與交互界面的這座橋,它允許用戶在交互界面上打開一個叫做「Terminal 終端」的應用程序,在其中輸入命令,系統會直接給出反饋。
因爲終端這座橋,實際允許用戶間接控制系統內核,也就是系統的大腦,因此它理論上具備控制一切的權利。
如何打開終端?
終端是系統中一個應用程序,你可以直接在所有程序中找到它,點擊打開就行。我比較喜歡使用聚焦搜索,輸入「終端」或「Terminal」,看到終端被選中了按下回車即可。
快速打開終端
基礎知識
本節會從零開始,一步步講解基礎知識。若你只想查看實際命令,可以完全跳過這一部分。
終端啓動後,就會進入一個問你要指令的狀態,你只需要將指令輸入在光標後,按下鍵盤迴車,指令就會被執行。
那麼什麼是命令?命令就是你告訴電腦希望它做什麼的那句話。若我現在希望告訴電腦說 hi,這句話的命令就是 say hi
,就這麼簡單。
命令由三個部分組成,第一個部分是命令對象,在 say hi
這個命令中,「say」 是我們的命令對象,我們希望電腦說話;第二個部分是修飾命令對象的關鍵詞,可有可無,若我希望電腦說話時慢一點,可以輸入 say -r 500 hi
,這裏的 「-r 500」 則是修飾說話語速的關鍵詞;第三部分是命令內容,這裏填寫希望電腦說的內容是「hi」這句話。
命令的組成
我們先來嘗試讓電腦將我們所打的話複述出來,這一步的指令是 echo "想說的話"
,將這句指令複製進終端並回車後,可以看到,它會將我們輸入進去的文字在下一行重新打出來。
echo
終端運行常常離不開對文件,文件夾的操作。
當你需要使用終端對文件夾進行操作時,終端需要你告訴它,你想要修改的文件在哪裏,這時我們需要了解路徑的概念。系統中的每一個文件都有一個存放位置,這一存放位置就稱作路徑。
終端啓動後,它的默認路徑在當前用戶文件夾的根目錄上,爲了確定這一點,你可以輸入 pwd
命令來查看當前路徑。在下圖中,輸入命令後,終端告訴我當前路徑是 /Users/我的名字
。
pwd
路徑的一般寫法爲 /文件夾名/文件夾名
,但路徑其實分爲兩種。一種叫相對路徑,另一種叫絕對路徑,它們兩有什麼區別呢?
我們從當前路徑說起,當前路徑指的是現在終端所處的位置,若你想改變當前路徑,則可以輸入 cd /其他文件夾
。比如我希望系統將當前路徑改爲所有應用程序文件夾,則輸入 cd /Applications
,在下圖中可以看到,Legolas 前出現了一個 Applications,表示當前路徑已經在應用程序文件夾中。
cd /
剛剛提到的路徑的一般寫法 「/文件夾名/文件夾名」,它指的其實就是絕對路徑,你必須指定它從根目錄一直到達具體的文件夾。
與其相對的是相對路徑,相對路徑允許你告訴終端從現在開始,接下來應該怎麼走。相對路徑的書寫方法實在絕對路徑前加一個 .
。
若你現在已經處在應用程序文件夾中,想前往其中的一個名叫 Utilities 的子文件夾應該怎麼辦?
下圖中,當前位置的絕對路徑是 /Applications/Utilities
,但由於我已經處於 /Applications
文件夾中,因此可以使用相對路徑的寫法 cd ./Utilities
,表示將當前路徑轉到 Utilities 文件夾。
cd ./
說了這麼多關於路徑的寫法,你可能已經頭大了,懶得去這麼寫,那麼有沒有快速導入路徑的方法呢?有,直接將待編輯文件或文件夾拖入終端中即可,它會自動把絕對路徑提取出來,實際情況下常用的也是這種自動提取或手動複製的方法。
拖入快速提取路徑
當你想要查看當前路徑下有什麼文件時,可以使用 ls
命令,它會列舉當前路徑下的全部文件,若你希查看進階設定,比如列舉當前路徑下的全部文件並展開所有子文件夾,可以在 ls
命令後加上 -R
的識別符,新指令就變成了 ls -R
,運行結果如下,可以看到我放在資源文件夾中的所有子文件都被顯示出來了。
ls -R
講到這裏,你也許會發現自己的終端已經滿滿當當的了,看着不舒服,這時可以使用 clear
指令來清屏,運行結果如下。
clear
以上講的所有指令,都是無害指令,這裏的無害指的是不會對系統文件造成破壞,但是還有一些指令,可以瞬間刪掉你的整個系統,若你知道這些指令的用法那也沒問題,但若是不小心根據網上的教程用了從而誤刪了東西就不好了。內核爲了確保你知道某些指令的用法,要求你必須在這些有風險的指令前加輸 sudo
,這就是所謂的超級管理員指令,它會在你密碼確認後,賦予 sudo 之後的命令最高權限,可以進行任何操作。
比如我需要把電腦上的 Windows 分區徹底刪除時,只需要輸入下面這串代碼,一瞬間整個磁盤分區就會被刪除:
sudo diskutil eraseVolume free none diskx
到這裏爲止,終端的非常基礎教學就已經講完了,這只是略過了終端海量指令中最常見的一小部分,畢竟終端控制的是整個系統的內核,其指令庫非常之大,沒有辦法全部講完。那麼,當你在網上見到一個新命令的時候,怎麼知道它該如何用?你可以使用 man 指令查看其用法,比如,當你見到了一個磁盤管理命令 diskutil
,可以使用 man diskutil
來查看這個磁盤管理命令的具體用法說明,想要退出這個說明按下鍵盤 Q
即可。
man
若你使用的是帶有觸控條的 Mac,可以點按觸控條按鈕進行快速更改終端顏色,添加書籤等操作。
觸控欄更改顏色
若你想要完全自定義終端,可以在「終端 - 偏好設置 - 描述文件」中進行更改。
自定義
常見玩法
- 關閉崩潰報錯:有時軟件崩潰就已經很讓人煩心了,重新打開後一遍遍彈出的問題報告更是煩不勝煩。這時你可以使用
defaults write com.apple.CrashReporter DialogType none
命令關閉這個問題報告。若你希望恢復其顯示,可以輸入defaults write com.apple.CrashReporter DialogType crashreport
。
煩人的崩潰提醒
- 修改文件日期: 有時你可能需要修改文件創建或修改日期,這時可以使用
touch -t 199505090000 拖入文件
命令。這句命令中的數字表示 1995 年 5 月 9 日 00:00 分,你可以根據實際需要修改。
任意修改文件日期
- 不要進入休眠狀態:當你臨時不希望電腦進入休眠狀態時,可以使用
caffeinate
命令讓電腦時刻清醒。當你需要其恢復正常時,按下⌃Control - C
即可停止該命令。
caffeinate
- 程序假死需要強退:有時候程序假死了,強行退出也沒用,這時可以使用
killall
命令。以微信爲例,若想強退它,只需輸入killall WeChat
即可。
killall
- 截圖保存爲 JPEG:Mac 的默認截圖格式爲 PNG,若你想讓默認的截圖保存類型爲 JPEG,可以輸入如下指令
defaults write com.apple.screencapture type jpg
,結果如下圖所示,以後的截圖都會變成 JPEG 格式。如果你希望撤銷這條指令,輸入defaults write com.apple.screencapture type png
即可。
運行命令後所有截圖均爲 JPEG
- 關閉截圖自動陰影: 若你使用 Mac 自帶的截圖,會發現每次的窗口截圖均會自動添加陰影,當你需要後期處理這些圖片時,這些陰影可能會對你造成困擾。你可以使用下面這串命令來關閉截圖陰影:
defaults write com.apple.screencapture disable-shadow -bool true; killall SystemUIServer
defaults write com.apple.screencapture disable-shadow -bool false; killall SystemUIServer
關閉陰影后的截圖
- 顯示隱藏文件夾:在你跟着網絡上的教程進行一些操作時,難免會遇到讓你尋找隱藏文件夾的情況,這時你可以使用:
defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder
defaults write com.apple.finder AppleShowAllFiles -bool false; killall Finder
顯示隱藏文件夾
- 整理程序欄:你也許會發現,底部的程序欄越用越亂,有時候內容多的半天找不到所需程序。這時你可以考慮爲其加入幾個隱藏的分界符將其歸爲幾個區域,輸入:
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
爲程序欄加分界符
- 重置程序欄:當你想要重新整理底部程序欄時,有時候從默認狀態開始整理也許是個好辦法。這是你可以使用
defaults delete com.apple.dock; killall Dock
命令將程序欄恢復爲電腦剛剛激活時的狀態。
恢復後的狀態
- 打印機械感十足的文字:當你想要打出機械感十足的文字時,可以玩玩
banner -w 80 legolas.me
這句命令,只需要將代碼結尾處的文字替換爲你想打印的字即可。打印文字
進階教程
上面講了不少指令,你也許會好奇,這些指令到底修改的是什麼?可以修改什麼?若我想改別的,應該去哪裏找?
默認設置 defaults
上面這些 defaults 開始的指令,實際修改的是系統默認的 Plist 表單,這些表單管理着系統中全部程序的默認設置,上面所做的修改無非是改了某些程序的默認設置罷了。
若你想查看還有哪些可以修改,可以在訪達中按下鍵盤 ⌥Option
,點擊「前往 - 資源庫」,找到 Perference 文件夾,你會發現所有的 Plist 文件均在這裏,你也可以根據便好手動修改。
Perference 文件夾
文件格式轉換 textutil
textutil 是一個系統自帶的,用於處理文稿的命令,其中我最常用的功能是其下屬功能 convert,這句指令允許你將任何文件,在以下文件格式中互相轉換 txt, html, rtf, rtfd, doc, docx, wordml, odt, webarchive。
若你手頭有一篇 DOCX 文件需要被轉換成 TXT,則可以輸入 textutil -convert txt 文件路徑
,這句代碼中的 txt 處,可以替換爲任何你需要轉換到的文件格式,文件路徑則可以採用拖拽文件到終端的方法自動填充。
textutil -convert
磁盤處理 diskutil
磁盤處理也是常用的命令行操作之一,因爲其命令需要根據具體情況具體對待,所以我只簡單介紹其中無風險的兩個,下方列舉的其餘操作均會直接處理磁盤內容,請務必清楚你在做什麼,然後再輸入命令。
若你的電腦採用的是 APFS 磁盤分區,則應使用 diskutil apfs
開頭的命令;若你的電腦採用的是 HFS,HFS+ 磁盤分區,則應使用 diskutil
開頭的命令;若你的電腦採用的是 coreStorage 磁盤分區,則應使用 diskutil cs
開頭的命令。
diskutil list
命令會將你的現有磁盤狀況顯示出來,如下圖所示。
diskutil list
diskutil cs list
命令會將你的現有的 Core Storage 邏輯分區狀況顯示出來,如下圖所示。
diskutil cs list
常用但有風險的命令 diskutil
- 查看分區上限:sudo diskutil resizeVolume /dev/disk1s3 limits
- 重置空間大小:sudo diskutil resizeVolume /dev/disk1s2 100GB
- 斷開驅動器:sudo diskutil unmountDisk force /dev/disk1
- 徹底移除邏輯磁盤: diskutil unmount /Volumes/Macintosh\ HD
- 顯示 GUID 分區結構: gpt -r show /dev/disk1
- 刪除 EFI NO NAME:gpt remove -I 4 /dev/disk1
- 新增存儲區塊:gpt add -I 3 -b 1362424032 -s 1269536 -t 426F6F74-0000-11AA- AA11-00306543ECAC
- 新增分區:newfs_hfs -J -v “Recovery HD” /dev/disk0s3
- 物理 Core Storage 擴容: diskutil cs resizeDisk 11111111-2222-3333-4444-555555555555 980g
- 邏輯 Core Storage 擴容: diskutil cs resizeVolume 11111111-2222-3333-4444-555555555555 980g
自動安裝 brew
Mac 有個很方便的包管理器,名叫 Homebrew,它允許你自動安裝許多應用程序。Homebrew 不是 terminal 的自帶內容,需要運行這串命令來進行安裝:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
使用 brew 命令前需要安裝 Homebrew
安裝完成後你可以直接使用 brew cask install 軟件英文名
等命令來快速安裝需要的軟件。Homebrew 在少數派已經有不少介紹了,因此這裏不再詳述。
關聯閱讀:9 條進階命令,把 HomeBrew 打造成第三方應用的 App Store;Mac 上高質量的開源應用,你可以在這裏一次找到
文件刪除 rm
這一指令本是 刪除文件 用的,但正因爲它可以不分敵我的刪除任何文件,新手誤用有極大風險,因此我不打算詳細介紹這個。網上有一個臭名遠揚的傳言,欺騙別人用 sudo rm -rfv /Cool
來刪除系統文件,從而使整個系統崩潰,這條命令絕對不要嘗試。
我們來用前面學到的知識分析一下爲什麼這句命令會使得系統崩潰。首先 sudo 表示管理員命令並獲取最高權限,rm
表示刪除文件,用 man rm
命令查看手冊,可以發現 -r 是用來修飾 rm 命令的,表示刪除當前工作路徑下的全部子文件,-f 也是修飾 rm 命令的,表示無視被保護的文件依舊執行刪除。
前文在講默認路徑時提到,打開終端之後默認工作路徑正是當前用戶的根目錄,因此執行 sudo rm -rfv /Cool
後,會從根目錄開始,無視被保護的文件並且刪除當前路徑下的所有文件及子文件夾,包括系統文件,這樣一來系統就廢了。
既然談到了這個代碼的破壞力,我索性用與 Mac 同源的 fedora 系統在虛擬機上跑了一遍,下圖是跑代碼前:
虛擬機 fedora 中運行破壞代碼
下圖是跑代碼後,遇到了一個小問題,下面這張截圖已經是在 Mac 上了。你仔細觀察可以發現截圖裏的複製窗口前面的圖標損壞了,這是因爲當我在虛擬機中運行此破壞代碼時,Parallel Desktop 實際並沒有將 fedora 系統獨立於沙盒中。
半分鐘後我發現了這個問題但爲時已晚,這個小實驗直接破壞了我正在使用的 Mac 系統並造成超過 100 GB 文件丟失,許多系統軟件已無法正常運行,萬幸訪達等核心功能還可以正常工作。爲了修復這個錯誤,我不得不評估損失,備份文件以及重裝系統。
直接對 Mac 造成無法挽回的破壞
至於什麼是沙盒,什麼是虛擬機,這是另一個話題了,若你有興趣可以在本文下方評論。簡單來說,虛擬機可以在在工作電腦中模擬一個獨立運行環境,使用它,可以允許你在一個系統的同時運行另一個系統。沙盒是一種保護機制,保證了當前在虛擬機中運行的任何內容不會影響工作機本身。
這個在虛擬機 Fedora 中運行的破壞代碼的實驗本來不應該破壞我正常使用的 Mac 系統,最終導致 Mac 被破壞時由於 Parallel Desktop 這個軟件默認虛擬機不開啓沙盒模式導致的慘劇。
其它命令
當然命令遠不止上面所提到的這些,常見的還有 cp
複製文件; mv
移動文件; mkdir
創建目錄; cat
顯示文件內容等等