再強調一遍:Unix 不是 Linux!

摘要:程式設計師都知道,Linux 不是 Unix,不過二者之間確實存在關係,即 Linux 系統是從 Unix 派生出來的,而 Linux 是一個類 Unix 的作業系統。那麼,二者之間具體存在哪些明顯的差異呢?

原文連結:https://akr.am/blog/posts/unix-is-not-linux

作者 | Mohamed Akram

譯者 | 彎月

網上很多有關POSIX和Unix工具的教程和指南總是假設你安裝了Linux,或者更具體地說,安裝了基於GNU的作業系統。然而,在探討shell的行為、工具程序以及C的標準庫時,這種假設往往會產生很大的影響。

雖然Linux的主導地位可能會讓我們忽略Linux與這些作業系統的不同,但我們還是應該有一定的了解。在本文中,我將列出一些比較明顯的差異。

Bash不是標準的shell

Bash不是標準的shell

所有Unix系統上的默認shell都是sh,而不是bash。POSIX標準中介紹了sh中使用的語言。然而,在許多Linux系統上,sh只是指向bash的連結,這樣可以用更接近標準的方式來使用bash,但人們依然可以使用一些無法在其他系統上使用的bash功能。如有疑問,請參閱標準。

Unix不包含長選項

Unix不包含長選項

Unix命令的選項有兩種寫法:短選項(只有一條短線-)與長選項(有兩條短線–)。短選項一般會採用縮寫的形式,而長選項一般會寫出完整的單詞。

許多工具程序都接受長選項,例如grep –count,對應的短選項是grep -c。前者是GNU的寫法,其他系統通常不會採用這種寫法,例如BSD。事實上,標準的getopts工具程序和相應的getopt C函數只支持短選項。

Make不同於GNU make

Make不同於GNU make

POSIX版本的make比GNU版本更有侷限性。這個問題很難解決,因為規範的許多方面都有所欠缺,特別是邏輯或條件運算子。為了解決這個問題,你可以將一些邏輯移動到configure腳本,由這個腳本生成另一個Makefile,然後再包含到主檔案中。此外,BSD的語法與GNU完全不同,例如條件語句。幸運的是,如果你只關注macOS和Linux,則可以放心地使用GNU的特性,因為macOS都是基於GNU的。

C編譯器不同於GCC

C編譯器不同於GCC

在Makefiles檔案中引用C編譯器時,最好使用變數$(CC),在編譯C++程式碼時,最好使用變數$(CXX)。大多數BSD系統的默認編譯器如今都改為使用Clang了,而且不提供gcc可執行檔案。如果是在Makefiles以外使用C和C++編譯器,則可以直接使用cc和c++命令,這兩個命令能在所有系統上工作。

GNU不同於Linux

GNU不同於Linux

二者略有不同,GNU接口不一定會出現在Linux系統上。例如,Alpine Linux發行版因其輕量級而流行於Docker容器中,它沒有使用musl的GNU C庫,而且放棄了GNU工具程序,改為使用BusyBox。因此,最好還是使用可移植的接口,即便你的目標只是Linux系統。

Unix不同於UNIX

Unix不同於UNIX

最後,請注意,Unix與UNIX也不完全相同。後者是需要The Open Group認證的商標。在眾多經過認證的作業系統中,最有名的是macOS,它遵循一切UNIX規範。也就是說,包括BSD在內的大多數類Unix系統以及GNU工具都在努力盡量遵守標準。

相關文章

UNIX 工作站的大規模滅絕

UNIX 工作站的大規模滅絕

行業快速迭代下,軟硬體的淘汰速度似乎遠超我們的想象。 連結:https://www.osnews.com/story/135605/the-...

吳峰光殺進 Linux 核心

吳峰光殺進 Linux 核心

【編者按】吳峰光,Linux 核心守護者,學生時代被同學戲稱為「老神仙」,兩耳不聞窗外事,一心只搞 Linux。吳峰光的 Linux 核心之...

Unix 版權爭奪戰 | 歷史上的今天

Unix 版權爭奪戰 | 歷史上的今天

整理 | 王啟隆 透過「歷史上的今天」,從過去看未來,從現在亦可以改變未來。 今天是 2023 年 3 月 6 日,在 1475 年的今天,...