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 的轻微不兼容在实践中从来不是问题,而且非常有用。
特别是,不要仅仅因为某个标准说某个新特性是“禁止的”或“已弃用的”就拒绝它,或者移除某个旧特性。