什麼是終端?
我們總在說在終端中如何操作,那麼終端到底是什麼呢?為什麼它會有這麼大的權利?
要說清終端是什麼,我們先來看看作業系統的組成。簡化來說,作業系統分為兩個部分,一部分稱作核心,另一部分成為使用者互動界面。核心部分負責系統的全部邏輯操作,由海量指令組成,這一部分是系統運作的命脈,不與使用者接觸;互動界面則是開機之後所有我們所看到的東西,比如視窗,軟體,應用程式等等。
那麼我們若我們想對系統核心的某些操作邏輯做出一些修改,應該怎麼辦呢?終端就是連接配接核心與互動界面的這座橋,它允許使用者在互動界面上打開一個叫做「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 分區徹底删除時,隻需要輸入下面這串代碼,一瞬間整個磁盤分區就會被删除:
關聯閱讀:如何徹底移除你的 Boot Camp 分區?
到這裡為止,終端的非常基礎教學就已經講完了,這隻是略過了終端海量指令中最常見的一小部分,畢竟終端控制的是整個系統的核心,其指令庫非常之大,沒有辦法全部講完。那麼,當你在網上見到一個新指令的時候,怎麼知道它該如何用?你可以使用 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-ap ps -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 的自帶内容,需要運作這串指令來進行安裝:
使用 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 顯示檔案内容等等,這裡就不再一一介紹了。若你有興趣可以閱讀下面這篇文章,裡面有每個指令的詳細介紹。