Bash、Zsh 和其他 Linux Shell 之間有什麼區別?

已發表: 2022-01-29

大多數 Linux 發行版默認包含 bash shell,但您也可以切換到另一個 shell 環境。 Zsh 是一個特別受歡迎的替代方案,還有其他 shell,如 ash、dash、fish 和 tcsh。 但是有什麼區別,為什麼有這麼多?

貝殼有什麼作用?

當您在命令行登錄或在 Linux 上啟動終端窗口時,系統會啟動 shell 程序。 Shell 提供了一種擴展命令行環境的標準方法。 如果您願意,可以將默認外殼換成另一個外殼。

第一個 shell 環境是 Thompson Shell,由貝爾實驗室開發並於 1971 年發布。從那時起,Shell 環境一直在構建這一概念,添加了各種新特性、功能和速度改進。

例如,Bash 提供了命令和文件名補全、高級腳本功能、命令歷史記錄、可配置顏色、命令別名以及 1971 年第一個 shell 發佈時不可用的各種其他功能。

shell 也被各種系統服務在後台使用。 Linux 發行版包括許多編寫為 shell 腳本的函數。 這些腳本是通過 shell 環境運行的命令和其他高級 shell 腳本功能。

導致 Bash 的 Shell:sh、csh、tsh 和 ksh

相關:什麼是 Unix,它為什麼重要?

現代 shell 最突出的祖先是 Bourne shell(也稱為“sh”),它以其在 AT&T 貝爾實驗室工作的創始人 Stephen Bourne 的名字命名。 它於 1979 年發布,成為 Unix 中的默認命令解釋器,因為它支持命令替換、管道、變量、條件測試和循環以及其他功能。 它沒有為用戶提供太多的定制,也不支持像別名、命令完成和 shell 函數這樣的現代細節(儘管最後一個被添加了)。

廣告

C shell 或“csh”由加州大學伯克利分校的 Bill Joy 在 1970 年代後期開發。 它添加了許多交互元素,用戶可以使用這些元素控制他們的系統,例如別名(長命令的快捷方式)、作業管理能力、命令歷史記錄等等。 它以 C 編程語言為模型,Unix 操作系統本身就是用這種語言編寫的。這也意味著 Bourne shell 的用戶必須學習 C 才能在其中輸入命令。 此外,csh 有相當多的 bug 需要用戶和創作者在很長一段時間內敲定。 人們最終將 Bourne shell 用於腳本,因為它可以更好地處理非交互式命令,但在正常使用時仍堅持使用 C shell。

隨著時間的推移,許多人修復了 C shell 中的錯誤並添加了特性,最終形成了一個改進的 csh 版本,稱為“tcsh”。 但是 csh 仍然是基於 Unix 的計算機的默認設置,並且添加了一些非標準功能。 貝爾實驗室的 David Korn 致力於 KornShell 或“ksh”,它試圖通過向後兼容 Bourne shell 的語言但添加 csh shell 的許多功能來改善這種情況。 它於 1983 年發布,但在專有許可下。 直到 2000 年代,它才成為自由軟件,當時它是在各種開源許可下發布的。

bash 的誕生

用於 Unix 的便攜式操作系統接口或 POSIX 是對繁忙的專有 csh 實現的另一種回應。 它成功地創建了命令解釋標準(除其他外),並最終反映了 KornShell 中的許多功能。 與此同時,GNU 項目試圖創建一個免費的、與 Unix 兼容的操作系統。 GNU 項目開發了一個自由軟件 shell 作為其自由操作系統的一部分,並將其命名為“Bourne Again Shell”或“bash”。

Bash 自 1989 年首次發布以來的幾十年裡一直在改進,但它仍然是當今大多數 Linux 發行版的默認 shell。 它也是 Apple macOS 上的默認 shell,可在 Microsoft 的 Windows 10 上安裝。

較新的 Shell:ash、dash、zsh 和 fish

雖然此後幾年 Linux 社區已經選擇了 Bash,但在 28 年前 Bash 首次發佈時,開發人員並沒有停止創建新的 shell。

廣告

Kenneth Almquist 創建了一個 Bourne shell 克隆,稱為 Almquish shell、A Shell、“ash”,或者有時只是“sh”。 它也與 POSIX 兼容,並成為 BSD(Unix 的一個不同分支)中的默認 shell。 ash shell 比 bash 更輕量,這使得它在嵌入式 Linux 系統中很流行。 如果你有一個安裝了 BusyBox 的 Android 手機——或者任何其他安裝了 BusyBox 軟件套件的設備——它使用的是來自 ash 的代碼。

Debian 開發了一個基於 ash 的 shell 環境,並稱之為“dash”。 它被設計為兼容 POSIX 且輕量級,因此它比 Bash 更快,但不會擁有它的所有功能。 Ubuntu 使用 dash shell 作為非交互式任務的默認 shell,加速 shell 腳本和其他在後台運行的任務。 然而,Ubuntu 仍然使用 bash 作為交互式 shell,因此用戶仍然擁有全功能的交互式環境。

最受歡迎的新 shell 之一是 Z shell,或“zsh”。 zsh 由 Paul Falstad 於 1990 年創建,是一個 Bourne 風格的 shell,它包含您在 bash 中可以找到的功能,甚至更多。 例如,zsh 具有拼寫檢查、監視登錄/註銷的能力、一些內置的編程功能(如字節碼)、支持科學記數法的語法、允許浮點運算等功能。

另一個較新的 shell 是 2005 年發布的 Friendly Interactive Shell 或“fish”。它具有獨特的命令行語法,旨在更容易學習,但不是從 Bourne shell 或 C shell 派生的。 這是一個有趣的想法,但是您通過使用 fish 學到的東西並不一定會幫助您使用 bash 和其他 Bourne 派生的 shell。

你應該選擇哪個? (以及為什麼 Zsh 很受歡迎)

您無需選擇外殼。 您的操作系統會為您選擇默認 shell,而該選擇幾乎總是 bash。 坐在 Linux 發行版(甚至是 Mac)前,您幾乎總會擁有一個 bash shell 環境。 Bash 有很多高級功能,但除非您編寫 shell 腳本,否則您可能不會使用它們。

在嵌入式 Linux 系統或 BSD 系統上,您最終會得到 ash shell。 但是 ash 是基於 Bourne 的 shell,並且在很大程度上與 bash 兼容。 您從使用 bash 獲得的任何知識都將轉移到使用 ash 或 dash shell,儘管此輕量級 shell 中不提供一些高級腳本功能。

廣告

您將遇到的幾乎每個 shell 都是基於 Bourne 的,並且工作方式類似——包括 zsh。

這就是 zsh 受歡迎的原因。 這個較新的 shell 與 bash 兼容,但包含更多功能。 zsh shell 提供內置的拼寫更正、改進的命令行補全、充當 shell 插件的可加載模塊、全局別名,允許您在命令行上為文件名或其他任何內容命名,而不僅僅是命令,以及更多主題支持。 它就像 bash,但如果您在命令行上花費大量時間,您可能會喜歡它有很多額外功能、附加功能和可配置選項。

如果您熟悉 bash,則無需學習其他語法即可切換到 zsh — 您只會獲得額外的功能。 如果您熟悉 zsh,則無需學習其他語法即可切換到 bash — 您將無法訪問這些功能。

“Oh My ZSH”是一個工具,可以幫助您更輕鬆地啟用 zsh 插件並在預製主題之間切換,快速自定義您的 zsh shell,而無需花費數小時進行調整。

還有其他貝殼。 例如,tcsh shell 仍然存在並且仍然是一個選項。 FreeBSD 使用 tsch 作為其默認的 root shell,並使用 ash 作為其默認的交互式 shell。 如果您經常使用 C 編程,tsch 可能更適合您。 但是,它遠沒有 bash 或 zsh 那樣常用。

如何在 shell 之間切換

切換到新的 shell 來試用它很容易。 只需從 Linux 發行版的包管理器中安裝 shell,然後鍵入命令來啟動 shell。

廣告

例如,假設您想在 Ubuntu 上試用 zsh。 您將運行以下命令進行安裝,然後啟動它:

 sudo apt install zsh

zsh

然後,您將坐在 zsh shell 中。 在 shell 中鍵入“ exit ”以離開它並返回到您當前的 shell。

這只是暫時的。 每當您打開新的終端窗口或在命令行登錄系統時,您都會看到您的默認 shell。 要更改登錄時看到的 shell(稱為登錄 shell),通常可以使用chsh或“更改 shell”命令。

要使用此命令,您首先需要使用 which 命令找到 shell 的完整路徑。 例如,假設我們想更改為 zsh shell。 我們將運行以下命令:

 哪個zsh

在 Ubuntu 上,這告訴我們 zsh 二進製文件存儲在 /usr/bin/zsh。

運行以下命令,輸入您的密碼,系統將提示您選擇一個新的登錄 shell:

 chsh
廣告

根據上面的命令,我們輸入/usr/bin/zsh 。 然後 zsh shell 將成為我們的默認值,直到我們運行chsh命令並將其改回。