跳至內容

Bourne Shell 指令碼/比較 Shell

來自華夏公益教科書,開放書籍,開放世界

幾乎所有像這樣的書籍都會有一節專門介紹(或者非常類似於)“為什麼你應該使用這本介紹的 shell/程式風格/語言/等,而不是其他執行相同任務但略有不同的其他 shell/程式風格/語言/等”。這似乎是強制性的。

然而,這本書不會這樣做。我們當然會談談“為什麼選擇 Bourne Shell”。但你很快就會發現,這並不排除其他 Shell。正如我們將在下面進一步解釋的那樣,沒有充分的理由不使用其他 Shell。

Bourne Shell 和其他 Unix 命令 Shell

[編輯 | 編輯原始碼]

如今,有許多 Unix 命令 Shell 可供使用。Bourne Shell 只是這片浩瀚海洋中的一滴水。所有這些 Shell 之間是什麼關係?它們的功能相同嗎?哪一個更好?讓我們看看什麼是 Shell,以及這對所有不同的 Shell 意味著什麼。

這一切是如何開始的...

[編輯 | 編輯原始碼]

自 20 世紀 70 年代 Unix 作業系統誕生以來,它對世界的看法一直很獨特。它與大多數其他作業系統截然不同,因為它的重點始終是 *高階使用者*: 那些希望從系統中榨取每一滴效能並具備相應技術知識的人。Unix 被設計成可以根據使用者的需求進行程式設計和修改。從本質上講,Unix 沒有使用者介面;相反,它由一個穩定的作業系統核心和一個通用的 C 庫組成。如果你不是想進行真正的硬核程式設計,而是想完成日常任務(甚至只是想快速編寫一個小程式),純粹的 Unix 會讓人非常頭疼。

換句話說,從一開始就清楚地知道需要一個工具,讓使用者可以使用編碼庫和核心提供的功能,而無需進行真正的程式設計工作。換句話說,一個可以快速輕鬆地將小命令傳遞到較低級別系統的工具。無需編譯器或其他花哨的編輯器,但能夠利用底層系統強大的功能。Stephen Bourne 承擔了這項任務,並想出了他稱之為 *shell* 的東西:一個小型、即時編譯器,它可以一次接收一個命令,將其翻譯成機器可以理解的位序列,並執行該命令。現在我們把這種型別的程式稱為 直譯器,但在當時,“shell”這個詞更為常見(因為它對使用者來說是底層系統的 shell)。Stephen 的 Shell 很精簡、很快,儘管有時有點笨拙,但它的強大功能至今仍讓許多當前的作業系統命令列介面望塵莫及。由於它是 Stephen Bourne 設計的,這個 Shell 被稱為 Bourne Shell。可執行檔案簡單地稱為 *sh*,這種 Shell 在指令碼編寫中的使用仍然非常普遍,以至於地球上沒有一個基於 Unix 的系統不提供一個可執行檔名為 sh 的 Shell。

...以及它最終的結果

[編輯 | 編輯原始碼]

當然,每個人都是批評家。Bourne Shell 被廣泛使用(實際上,它仍然在使用),因此它成為 Unix Shell 中的實際標準。但幾乎所有的人都立即(以及隨著使用)想要在 Shell 中新增新功能,或者想要一種更熟悉的方式來表達命令,或者其他一些東西。許多人建立了他們認為在 Bourne Shell 基礎上發展的新 Shell。有些與 Bourne Shell 完全相容,有些則不那麼相容。一些變得很有名,另一些則失敗了。但幾乎所有這些 Shell 都對 Bourne Shell 抱有深情,他們稱之為“爸爸……”

這些 Shell 中的許多可以以 sh 類似模式執行,更密切地模仿最原始的 sh,儘管大多數人傾向於以預設模式執行它們的 Shell,這比最小的 sh 提供了更多功能。

它是 Bourne Shell,但不是我們所知的...

[編輯 | 編輯原始碼]

所以有很多 Shell 可用,但你能在任何地方找到 Bourne Shell,對嗎?老式的 *sh*,一直忠實地坐到世界末日……

嗯,不,不完全是。現在大多數 sh 可執行檔案實際上已經不再是 Bourne Shell 了。透過 Unix 中一項名為連結的魔法(它允許一個檔案偽裝成另一個檔案),你在任何 Unix 系統上找到的 sh 可執行檔案很可能實際上是基於 Bourne Shell 的 Shell 之一。如今,最常用的 Shell 之一是(隨著 GNU 和 Linux 等免費和開源作業系統的興起)由自由軟體基金會生產的 Bourne Shell 的高度擴充套件形式,稱為 Bash。不過,Bash 並沒有忘記它的根源:它代表了 **B**ourne **A**gain **SH**ell。

另一個後代 Shell 代表其祖先的例子是 Korn Shell (ksh)。它也是一個擴充套件 Shell,與 sh 完全相容——它只是添加了一些功能。zsh 也差不多。

最後,C Shell (csh) 及其後代 tcsh(在 BSD 系統上是原生的)形成了一個略有不同的類別。這些 Shell 在一定程度上打破了相容性,在許多命令中使用不同的語法。使用這些 Shell 作為標準 Shell 的系統通常會提供一個真正的 Bourne Shell 可執行檔案來執行通用的 Bourne Shell 指令碼。

閱讀了上述內容後,你會明白為什麼這本書不需要說服你使用 Bourne Shell 而不是其他任何 Shell:在大多數情況下,沒有明顯的區別。Bourne Shell 及其遺產已深深根植於 Unix 環境的精髓之中,因此當你使用任何可用的 Shell 時,你實際上就是在使用 Bourne Shell。

為什麼選擇 Bourne Shell

[編輯 | 編輯原始碼]

所以只剩下一個真正的問題:既然你現在擁有了自己的 Unix 系統,有了自己的 Shell 和所有功能,是否有什麼真正的理由使用 Bourne Shell 而不是使用 Shell 的全部功能呢?

嗯,這取決於情況。可能沒有。在大多數情況下,你 *確實* 在使用 Bourne Shell,因為你使用了 Shell 的全部潛力——你的 Shell 很可能 *非常* 類似於 Bourne Shell。但有一件事你可能要牢記在心:你可能有一天想編寫一個想要傳遞給其他人的指令碼。當然,你可以使用 Shell 提供的所有選項來編寫你的指令碼;但這可能不適用於其他機器上的其他 Shell。這就是 Bourne Shell 作為 Unix 命令 Shell 的 通用語 的作用——也是瞭解如何編寫專門針對 Bourne Shell 的指令碼非常有用的地方。如果你為 Bourne Shell 編寫指令碼,並且只為 Bourne Shell 編寫指令碼,那麼你的指令碼直接從郵件附件中執行(別告訴我你還在用箱子裝東西——拜託,跟上時代)的可能性遠遠大於其他任何命令 Shell。


下一頁: 執行命令
主頁: Bourne Shell 指令碼
華夏公益教科書