使用Mac系統的朋友應該比較熟悉Zsh和Bash這兩個shell,但是對二者具體有什麼區別可能不太瞭解。本文將從這兩個shell入手,對相關概念以及二者區別進行解釋。
1.什麼是shell?
shell 單詞的本意是“殼子”,在計算機領域一樣可以理解為機器外面的一層殼,目的是進行用於人機互動,本質上是命令直譯器。只要是人與電腦之間互動的介面,就可以稱為 shell。
需要說明的是,常見的概念包括shell指令碼,其指的是採用shell語言編寫的指令碼,可以使用shell程式來進行執行,而本文所說的shell均指的是shell程式。二者之間的關係可見下圖:
2.有哪些shell?
- zsh
很多人的 mac 中會使用 zsh 而不是 bash,一大半是因為 oh-my-zsh 這個配置集,它相容 bash,還有自動補全等好用的功能。 - sh
sh的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發,為了紀念他,就用他的名字命名了。sh 是 UNIX 上的標準 shell,很多 UNIX 版本都配有 sh。sh 是第一個流行的 shell。 - csh
sh 之後另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。 - tcsh
tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支援。 - ash
ash是一個簡單的輕量級的 Shell,佔用資源少,適合執行於低記憶體環境,但是與下面講到的 bash shell 完全相容。 - bash
bash是基於GUN架構開發的,開發者叫史蒂芬博恩,是BourneAgain Shell的縮寫。保持了對 sh shell 的相容性,是各種 Linux 發行版預設配置的 shell。bash 相容 sh 意味著,針對 sh 編寫的 shell 程式碼可以不加修改地在 bash 中執行。儘管如此,bash 和 sh 還是有一些不同之處:一方面,bash 擴充套件了一些命令和引數;另一方面,bash 並不完全和 sh 相容,它們有些行為並不一致,但在大多數企業運維的情況下區別不大,特殊場景可以使用 bash 代替 sh。
3.怎麼檢視自己使用的是哪一個shell?
在現代的 Linux 上,sh 已經被 bash 代替,/bin/sh往往是指向/bin/bash的符號連結。如果你希望檢視當前 Linux或MacOS的預設shell,那麼可以輸出 shell 環境變數:
echo $SHELL
如果想知道自己系統安裝了哪些shell,使用如下命令可得到如下所示的資訊。
cat /etc/shells
4. shell如何配置?
如上所說,shell 在啟動時都會去找配置檔案,然後執行它。你安裝的一些指令碼,如果想讓它能夠全域性執行,就需要在配置檔案中設定路徑。有過設定路徑後還是不管用的經歷嗎?多半是因為把配置寫在了錯誤的配置檔案裡。* 應該在配置shell(最常見的是配置預設命令)之前,使用 echo $SHELL,確認自己現在用的是什麼shell後,再去編輯對應的配置檔案 *。
5. bash和zsh的區別
一句話,二者均是shell的一種,zsh能基本完美相容bash的命令,並且使用起來更加優雅。由於bash或zsh本質上都是直譯器,他們所共同服務的是shell語言,因此在命令語法上基本相同,部分相容性會有一些差異
二者切換:
- 切換bash: chsh -s /bin/bash
- 切換zsh: chsh -s /bin/zsh
- 在終端app的系統偏好設定裡手動設定。
在配置檔案方面:
- bash讀取的配置檔案:~/.bash_profile檔案
- zsh讀取的配置檔案:~/.zshrc檔案
當從bash切換為zsh時,如果不想重新配置一遍.zshrc檔案,可以__在.zshrc檔案中加上source ~/.bash_profile,從而直接從.bash_profile檔案讀取配置。
mac修改預設shell為bash
-
開啟系統偏好設定
-
點選使用者群組
-
按住ctrl,點選使用者名稱
-
點選高階選項,修改登入shell