Bash shell 的誕生
對於任何從事於系統管理員方面的人來說,Shell 腳本編程是一門必不可少的技能,而如今人們編寫腳本的主要 shell 是 Bash。Bash 是幾乎所有的 Linux 發行版和現代 MacOS 版本的默認配置,也很快就會成為 Windows 終端的原生部分。你可以說 Bash 無處不在。
那麼它是如何做到這一點的呢?本周的《代碼英雄》播客將通過詢問編寫那些代碼的人來深入研究這個問題。
肇始於 Unix
像所有編程方面的東西一樣,我們必須追溯到 Unix。shell 的簡短歷史是這樣的:1971 年,Ken Thompson 發布了第一個 Unix shell:Thompson shell。但是,腳本用戶所能做的存在嚴重限制,這意味著嚴重製約了自動化以及整個 IT 運營領域。
這個奇妙的研究概述了早期嘗試腳本的挑戰:
類似於它在 Multics 中的前身,這個 shell(
/bin/sh
)是一個在內核外執行的獨立用戶程序。諸如通配(參數擴展的模式匹配,例如*.txt
)之類的概念是在一個名為glob
的單獨的實用程序中實現的,就像用於計算條件表達式的if
命令一樣。這種分離使 shell 變得更小,才不到 900 行的 C 源代碼。shell 引入了緊湊的重定向(
<
、>
和>>
)和管道(|
或^
)語法,它們已經存在於現代 shell 中。你還可以找到對調用順序命令(;
)和非同步命令(&
)的支持。Thompson shell 缺少的是編寫腳本的能力。它的唯一目的是作為一個互動式 shell(命令解釋器)來調用命令和查看結果。
隨著對終端使用的增長,對自動化的興趣隨之增長。
Bourne shell 前進一步
在 Thompson 發布 shell 六年後,1977 年,Stephen Bourne 發布了 Bourne shell,旨在解決Thompson shell 中的腳本限制。(Chet Ramey 是自 1990 年以來 Bash 語言的主要維護者,在這一集的《代碼英雄》中討論了它)。作為 Unix 系統的一部分,這是這個來自貝爾實驗室的技術的自然演變。
Bourne 打算做什麼不同的事情?研究員 M. Jones 很好地概述了它:
Bourne shell 有兩個主要目標:作為命令解釋器以交互方式執行操作系統的命令,和用於腳本編程(編寫可通過 shell 調用的可重用腳本)。除了替換 Thompson shell,Bourne shell 還提供了幾個優於其前輩的優勢。Bourne 將控制流、循環和變數引入腳本,提供了更具功能性的語言來(以互動式和非互動式)與操作系統交互。該 shell 還允許你使用 shell 腳本作為過濾器,為處理信號提供集成支持,但它缺乏定義函數的能力。最後,它結合了我們今天使用的許多功能,包括命令替換(使用後引號)和 HERE 文檔(以在腳本中嵌入保留的字元串文字)。
Bourne 在之前的一篇採訪中這樣描述它:
最初的 shell (編程語言)不是一種真正的語言;它是一種記錄 —— 一種從文件中線性執行命令序列的方法,唯一的控制流的原語是
GOTO
到一個標籤。Ken Thompson 所編寫的這個最初的 shell 的這些限制非常重要。例如,你無法簡單地將命令腳本用作過濾器,因為命令文件本身是標準輸入。而在過濾器中,標準輸入是你從父進程繼承的,不是命令文件。最初的 shell 很簡單,但隨著人們開始使用 Unix 進行應用程序開發和腳本編寫,它就太有限了。它沒有變數、它沒有控制流,而且它的引用能力非常不足。
對於腳本編寫者來說,這個新 shell 是一個巨大的進步,但前提是你可以使用它。
以自由軟體來重新構思 Bourne Shell
在此之前,這個佔主導地位的 shell 是由貝爾實驗室擁有和管理的專有軟體。幸運的話,你的大學可能有權訪問 Unix shell。但這種限制性訪問遠非自由軟體基金會(FSF)想要實現的世界。
Richard Stallman 和一群志同道合的開發人員那時正在編寫所有的 Unix 功能,其帶有可以在 GNU 許可證下免費獲得的許可。其中一個開發人員的任務是製作一個 shell,那位開發人員是 Brian Fox。他對他的任務的講述十分吸引我。正如他在播客上所說:
它之所以如此具有挑戰性,是因為我們必須忠實地模仿 Bourne shell 的所有行為,同時允許擴展它以使其成為一個供人們使用的更好工具。
而那時也恰逢人們在討論 shell 標準是什麼的時候。在這一歷史背景和將來的競爭前景下,流行的 Bourne shell 被重新構想,並再次重生。
重新打造 Bourne Shell
自由軟體的使命和競爭這兩個催化劑使重製的 Bourne shell(Bash)具有了生命。和之前不同的是,Fox 並沒有把 shell 放到自己的名字之後命名,他專註於從 Unix 到自由軟體的演變。(雖然 Fox Shell 這個名字看起來要比 Fish shell 更適合作為 fsh 命令 #missedopportunity)。這個命名選擇似乎符合他的個性。正如 Fox 在劇集中所說,他甚至對個人的榮耀也不感興趣;他只是試圖幫助編程文化發展。然而,他並不是一個優秀的雙關語。
而 Bourne 也並沒有因為他命名 shell 的文字遊戲而感到被輕視。Bourne 講述了一個故事,有人走到他面前,並在會議上給了他一件 Bash T 恤,而那個人是 Brian Fox。
Shell | 發佈於 | 創造者 |
---|---|---|
Thompson Shell | 1971 | Ken Thompson |
Bourne Shell | 1977 | Stephen Bourne |
Bourne-Again Shell | 1989 | Brian Fox |
隨著時間的推移,Bash 逐漸成長。其他工程師開始使用它並對其設計進行改進。事實上,多年後,Fox 堅定地認為學會放棄控制 Bash 是他一生中最重要的事情之一。隨著 Unix 讓位於 Linux 和開源軟體運動,Bash 成為開源世界的至關重要的腳本語言。這個偉大的項目似乎超出了單一一個人的願景範圍。
我們能從 shell 中學到什麼?
shell 是一項技術,它是筆記本電腦日常使用中的一個組成部分,你很容易忘記它也需要發明出來。從 Thompson 到 Bourne 再到 Bash,shell 的故事為我們描繪了一些熟悉的結論:
- 有動力的人可以在正確的使命中取得重大進展。
- 我們今天所依賴的大部分內容都建立在我們行業中仍然活著的那些傳奇人物打下的基礎之上。
- 能夠生存下來的軟體超越了其原始創作者的願景。 代碼英雄在全部的第三季中講述了編程語言,並且正在接近它的尾聲。請務必訂閱,來了解你想知道的有關編程語言起源的各種內容,我很樂意在下面的評論中聽到你的 shell 故事。
via: https://opensource.com/19/9/command-line-heroes-bash
作者:Matthew Broberg 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive