Mac Terminal 終端:入門指南及進階技巧

什麼是終端?

我們總在說在終端中如何操作,那麼終端到底是什麼呢?爲什麼它會有這麼大的權利?

要說清終端是什麼,我們先來看看操作系統的組成。簡化來說,操作系統分爲兩個部分,一部分稱作內核,另一部分成爲用戶交互界面。內核部分負責系統的全部邏輯操作,由海量命令組成,這一部分是系統運行的命脈,不與用戶接觸;交互界面則是開機之後所有我們所看到的東西,比如窗口,軟件,應用程序等等。

 

null

 

那麼我們若我們想對系統內核的某些操作邏輯做出一些修改,應該怎麼辦呢?終端就是連接內核與交互界面的這座橋,它允許用戶在交互界面上打開一個叫做「Terminal 終端」的應用程序,在其中輸入命令,系統會直接給出反饋。

因爲終端這座橋,實際允許用戶間接控制系統內核,也就是系統的大腦,因此它理論上具備控制一切的權利。

如何打開終端?

終端是系統中一個應用程序,你可以直接在所有程序中找到它,點擊打開就行。我比較喜歡使用聚焦搜索,輸入「終端」或「Terminal」,看到終端被選中了按下回車即可。

 

快速打開終端

快速打開終端

 

基礎知識

本節會從零開始,一步步講解基礎知識。若你只想查看實際命令,可以完全跳過這一部分。

終端啓動後,就會進入一個問你要指令的狀態,你只需要將指令輸入在光標後,按下鍵盤迴車,指令就會被執行。

那麼什麼是命令?命令就是你告訴電腦希望它做什麼的那句話。若我現在希望告訴電腦說 hi,這句話的命令就是 say hi,就這麼簡單。

命令由三個部分組成,第一個部分是命令對象,在 say hi 這個命令中,「say」 是我們的命令對象,我們希望電腦說話;第二個部分是修飾命令對象的關鍵詞,可有可無,若我希望電腦說話時慢一點,可以輸入 say -r 500 hi,這裏的 「-r 500」 則是修飾說話語速的關鍵詞;第三部分是命令內容,這裏填寫希望電腦說的內容是「hi」這句話。

 

命令的組成

命令的組成

 

我們先來嘗試讓電腦將我們所打的話複述出來,這一步的指令是 echo "想說的話",將這句指令複製進終端並回車後,可以看到,它會將我們輸入進去的文字在下一行重新打出來。

 

echo

echo

 

終端運行常常離不開對文件,文件夾的操作。

當你需要使用終端對文件夾進行操作時,終端需要你告訴它,你想要修改的文件在哪裏,這時我們需要了解路徑的概念。系統中的每一個文件都有一個存放位置,這一存放位置就稱作路徑。

終端啓動後,它的默認路徑在當前用戶文件夾的根目錄上,爲了確定這一點,你可以輸入 pwd 命令來查看當前路徑。在下圖中,輸入命令後,終端告訴我當前路徑是 /Users/我的名字

 

pwd

pwd

 

路徑的一般寫法爲 /文件夾名/文件夾名,但路徑其實分爲兩種。一種叫相對路徑,另一種叫絕對路徑,它們兩有什麼區別呢?

我們從當前路徑說起,當前路徑指的是現在終端所處的位置,若你想改變當前路徑,則可以輸入 cd /其他文件夾。比如我希望系統將當前路徑改爲所有應用程序文件夾,則輸入 cd /Applications,在下圖中可以看到,Legolas 前出現了一個 Applications,表示當前路徑已經在應用程序文件夾中。

 

cd /

cd /

 

剛剛提到的路徑的一般寫法 「/文件夾名/文件夾名」,它指的其實就是絕對路徑,你必須指定它從根目錄一直到達具體的文件夾。

與其相對的是相對路徑,相對路徑允許你告訴終端從現在開始,接下來應該怎麼走。相對路徑的書寫方法實在絕對路徑前加一個 .

若你現在已經處在應用程序文件夾中,想前往其中的一個名叫 Utilities 的子文件夾應該怎麼辦?

下圖中,當前位置的絕對路徑是 /Applications/Utilities,但由於我已經處於 /Applications文件夾中,因此可以使用相對路徑的寫法 cd ./Utilities,表示將當前路徑轉到 Utilities 文件夾。

 

cd ./

cd ./

 

說了這麼多關於路徑的寫法,你可能已經頭大了,懶得去這麼寫,那麼有沒有快速導入路徑的方法呢?有,直接將待編輯文件或文件夾拖入終端中即可,它會自動把絕對路徑提取出來,實際情況下常用的也是這種自動提取或手動複製的方法。

 

拖入快速提取路徑

拖入快速提取路徑

 

當你想要查看當前路徑下有什麼文件時,可以使用 ls 命令,它會列舉當前路徑下的全部文件,若你希查看進階設定,比如列舉當前路徑下的全部文件並展開所有子文件夾,可以在 ls 命令後加上 -R 的識別符,新指令就變成了 ls -R,運行結果如下,可以看到我放在資源文件夾中的所有子文件都被顯示出來了。

 

ls -R

ls -R

 

講到這裏,你也許會發現自己的終端已經滿滿當當的了,看着不舒服,這時可以使用 clear指令來清屏,運行結果如下。

 

clear

clear

 

以上講的所有指令,都是無害指令,這裏的無害指的是不會對系統文件造成破壞,但是還有一些指令,可以瞬間刪掉你的整個系統,若你知道這些指令的用法那也沒問題,但若是不小心根據網上的教程用了從而誤刪了東西就不好了。內核爲了確保你知道某些指令的用法,要求你必須在這些有風險的指令前加輸 sudo,這就是所謂的超級管理員指令,它會在你密碼確認後,賦予 sudo 之後的命令最高權限,可以進行任何操作。

比如我需要把電腦上的 Windows 分區徹底刪除時,只需要輸入下面這串代碼,一瞬間整個磁盤分區就會被刪除:

sudo diskutil eraseVolume free none diskx

關聯閱讀:如何徹底移除你的 Boot Camp 分區?

到這裏爲止,終端的非常基礎教學就已經講完了,這只是略過了終端海量指令中最常見的一小部分,畢竟終端控制的是整個系統的內核,其指令庫非常之大,沒有辦法全部講完。那麼,當你在網上見到一個新命令的時候,怎麼知道它該如何用?你可以使用 man 指令查看其用法,比如,當你見到了一個磁盤管理命令 diskutil,可以使用 man diskutil來查看這個磁盤管理命令的具體用法說明,想要退出這個說明按下鍵盤 Q 即可。

 

man

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

caffeinate

 

  • 程序假死需要強退:有時候程序假死了,強行退出也沒用,這時可以使用 killall 命令。以微信爲例,若想強退它,只需輸入 killall WeChat 即可。

 

killall

killall

 

  • 截圖保存爲 JPEG:Mac 的默認截圖格式爲 PNG,若你想讓默認的截圖保存類型爲 JPEG,可以輸入如下指令 defaults write com.apple.screencapture type jpg,結果如下圖所示,以後的截圖都會變成 JPEG 格式。如果你希望撤銷這條指令,輸入 defaults write com.apple.screencapture type png 即可。

 

運行命令後所有截圖均爲 JPEG

運行命令後所有截圖均爲 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 文件夾

Perference 文件夾

 

文件格式轉換 textutil

textutil 是一個系統自帶的,用於處理文稿的命令,其中我最常用的功能是其下屬功能 convert,這句指令允許你將任何文件,在以下文件格式中互相轉換 txt, html, rtf, rtfd, doc, docx, wordml, odt, webarchive。

若你手頭有一篇 DOCX 文件需要被轉換成 TXT,則可以輸入 textutil -convert txt 文件路徑,這句代碼中的 txt 處,可以替換爲任何你需要轉換到的文件格式,文件路徑則可以採用拖拽文件到終端的方法自動填充。

 

textutil -convert

textutil -convert

 

磁盤處理 diskutil

磁盤處理也是常用的命令行操作之一,因爲其命令需要根據具體情況具體對待,所以我只簡單介紹其中無風險的兩個,下方列舉的其餘操作均會直接處理磁盤內容,請務必清楚你在做什麼,然後再輸入命令。

若你的電腦採用的是 APFS 磁盤分區,則應使用 diskutil apfs 開頭的命令;若你的電腦採用的是 HFS,HFS+ 磁盤分區,則應使用 diskutil 開頭的命令;若你的電腦採用的是 coreStorage 磁盤分區,則應使用 diskutil cs開頭的命令。

diskutil list 命令會將你的現有磁盤狀況顯示出來,如下圖所示。

 

diskutil list

diskutil list

 

diskutil cs list 命令會將你的現有的 Core Storage 邏輯分區狀況顯示出來,如下圖所示。

 

diskutil cs list

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 命令前需要安裝 Homebrew

 

安裝完成後你可以直接使用 brew cask install 軟件英文名 等命令來快速安裝需要的軟件。Homebrew 在少數派已經有不少介紹了,因此這裏不再詳述。

關聯閱讀:9 條進階命令,把 HomeBrew 打造成第三方應用的 App StoreMac 上高質量的開源應用,你可以在這裏一次找到

文件刪除 rm

這一指令本是 刪除文件 用的,但正因爲它可以不分敵我的刪除任何文件,新手誤用有極大風險,因此我不打算詳細介紹這個。網上有一個臭名遠揚的傳言,欺騙別人用 sudo rm -rfv /Cool 來刪除系統文件,從而使整個系統崩潰,這條命令絕對不要嘗試。

我們來用前面學到的知識分析一下爲什麼這句命令會使得系統崩潰。首先 sudo 表示管理員命令並獲取最高權限,rm 表示刪除文件,用 man rm 命令查看手冊,可以發現 -r 是用來修飾 rm 命令的,表示刪除當前工作路徑下的全部子文件,-f 也是修飾 rm 命令的,表示無視被保護的文件依舊執行刪除。

前文在講默認路徑時提到,打開終端之後默認工作路徑正是當前用戶的根目錄,因此執行 sudo rm -rfv /Cool 後,會從根目錄開始,無視被保護的文件並且刪除當前路徑下的所有文件及子文件夾,包括系統文件,這樣一來系統就廢了。

既然談到了這個代碼的破壞力,我索性用與 Mac 同源的 fedora 系統在虛擬機上跑了一遍,下圖是跑代碼前:

 

虛擬機 fedora 中運行破壞代碼

虛擬機 fedora 中運行破壞代碼

 

下圖是跑代碼後,遇到了一個小問題,下面這張截圖已經是在 Mac 上了。你仔細觀察可以發現截圖裏的複製窗口前面的圖標損壞了,這是因爲當我在虛擬機中運行此破壞代碼時,Parallel Desktop 實際並沒有將 fedora 系統獨立於沙盒中。

半分鐘後我發現了這個問題但爲時已晚,這個小實驗直接破壞了我正在使用的 Mac 系統並造成超過 100 GB 文件丟失,許多系統軟件已無法正常運行,萬幸訪達等核心功能還可以正常工作。爲了修復這個錯誤,我不得不評估損失,備份文件以及重裝系統。

 

直接對 Mac 造成無法挽回的破壞

直接對 Mac 造成無法挽回的破壞

 

至於什麼是沙盒,什麼是虛擬機,這是另一個話題了,若你有興趣可以在本文下方評論。簡單來說,虛擬機可以在在工作電腦中模擬一個獨立運行環境,使用它,可以允許你在一個系統的同時運行另一個系統。沙盒是一種保護機制,保證了當前在虛擬機中運行的任何內容不會影響工作機本身。

這個在虛擬機 Fedora 中運行的破壞代碼的實驗本來不應該破壞我正常使用的 Mac 系統,最終導致 Mac 被破壞時由於 Parallel Desktop 這個軟件默認虛擬機不開啓沙盒模式導致的慘劇。

其它命令

當然命令遠不止上面所提到的這些,常見的還有 cp複製文件; mv 移動文件; mkdir 創建目錄; cat 顯示文件內容等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章