再強調一遍:Unix 不是 Linux!

責編:中文妹 | 作者:Mohamed Akram 原文:http://985.so/bysem

譯者:CSDN - 彎月

大家好,我是中文妹。

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

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

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

1. Bash 不是標準的 shell

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

2. Unix 不包含長選項

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

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

3. Make 不同於 GNU make

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

4. C 編譯器不同於 GCC

在 Makefiles 文件中引用 C 編譯器時,最好使用變量 $(CC),在編譯 C++ 代碼時,最好使用變量 $(CXX)。大多數 BSD 系統的默認編譯器如今都改爲使用 Clang 了,而且不提供 gcc 可執行文件。如果是在 Makefiles 以外使用 C 和 C++ 編譯器,則可以直接使用 cc 和 c++ 命令,這兩個命令能在所有系統上工作。另外,搜索公衆號編程技術圈後臺回覆 “1024”,獲取一份驚喜禮包。

5. GNU 不同於 Linux

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

6. Unix 不同於 UNIX

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s?__biz=MzI4MDE1NjUxNQ==&mid=2247497305&idx=1&sn=2e9bcf01ada5df37bb1b162fd05043ed&chksm=ebbe7655dcc9ff4308335981ca161dc189835fe37162684ac9b06e5452c2244583bf8988b2ea&scene=178&cur_album_id=1836957698139930626#rd