什麼是shell?

水车發表於2024-06-17

使用Mac系統的朋友應該比較熟悉Zsh和Bash這兩個shell,但是對二者具體有什麼區別可能不太瞭解。本文將從這兩個shell入手,對相關概念以及二者區別進行解釋。

1.什麼是shell?

shell 單詞的本意是“殼子”,在計算機領域一樣可以理解為機器外面的一層殼,目的是進行用於人機互動,本質上是命令直譯器。只要是人與電腦之間互動的介面,就可以稱為 shell。
需要說明的是,常見的概念包括shell指令碼,其指的是採用shell語言編寫的指令碼,可以使用shell程式來進行執行,而本文所說的shell均指的是shell程式。二者之間的關係可見下圖:

2.有哪些shell?

  1. zsh
    很多人的 mac 中會使用 zsh 而不是 bash,一大半是因為 oh-my-zsh 這個配置集,它相容 bash,還有自動補全等好用的功能。
  2. sh
    sh的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發,為了紀念他,就用他的名字命名了。sh 是 UNIX 上的標準 shell,很多 UNIX 版本都配有 sh。sh 是第一個流行的 shell。
  3. csh
    sh 之後另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。
  4. tcsh
    tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支援。
  5. ash
    ash是一個簡單的輕量級的 Shell,佔用資源少,適合執行於低記憶體環境,但是與下面講到的 bash shell 完全相容。
  6. 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

  1. 開啟系統偏好設定

  2. 點選使用者群組

  3. 按住ctrl,點選使用者名稱

  4. 點選高階選項,修改登入shell

相關文章