GNU 專案將其他組織發布的標準視為建議,而非命令。我們會考慮這些標準,但我們並非「遵守」它們。在開發 GNU 程式時,當實作外部標準的規範能客觀地讓 GNU 系統整體變得更好時,你應該實作這些規範。反之,則不應該。
在大多數情況下,遵循已發布的標準對使用者來說很方便——這表示他們的程式或腳本將更具可攜性。例如,GCC 實作了標準 C 規範中幾乎所有的功能。如果沒有做到,C 程式開發者會感到不滿。而 GNU 工具程式大多遵循 POSIX.2 的規範;如果我們的程式不相容,shell 腳本的編寫者和使用者也會感到不滿。
但我們並非嚴格遵守這些規範中的任何一項,並且在某些特定方面,我們決定不遵循它們,以便讓 GNU 系統對使用者更好。
例如,標準 C 規定幾乎所有 C 語言的擴充功能都是禁止的。多麼愚蠢!GCC 實作了許多擴充功能,其中一些後來被採納為標準的一部分。如果你希望這些結構能像標準「要求」的那樣給出錯誤訊息,你必須指定 ‘--pedantic’,這個選項的實作只是為了讓我們可以說「GCC 是 100% 實作標準的」,而不是因為實際上真的有任何理由去使用它。
POSIX.2 規範 ‘df’ 和 ‘du’ 預設必須以 512 位元組為單位輸出大小。使用者想要的是 1k 為單位,所以這才是我們的預設做法。如果你想要 POSIX「要求」的荒謬行為,你必須設定環境變數 ‘POSIXLY_CORRECT’ (原本打算命名為 ‘POSIX_ME_HARDER’)。
當 GNU 工具程式支援長名稱的命令列選項,以及選項與一般參數混合使用時,它們也偏離了 POSIX.2 規範的字面意思。這種與 POSIX 的微小不相容性在實務上從來都不是問題,而且非常有用。
特別是,不要僅僅因為某個標準說某個新功能是「禁止的」或某個舊功能是「不建議使用的」就拒絕新功能或移除舊功能。