为什么 cat 不像我期望的 UNIX 程序那样使用选项?

为什么 cat 不像我期望的 UNIX 程序那样使用选项?

我使用 UNIX 的时间比我想的要长得多,在这段时间里,我已经习惯了当给程序提供相互矛盾的开关时,最后一个开关会获胜。最近我注意到

cat -bn file

cat -nb file

两者都使用-b选项 (number non-blank lines) 而不是选项-n(number all lines)。我在 BSD 和 Linux 上都遇到了这种行为,所以我不认为这是一个实现怪癖。这是在某处指定的吗?我只是疯了才期望第一个例子对所有行进行编号?

答案1

我看了看FreeBSD 中 cat 的源代码(1),相关源代码行如下:

case 'b':
    bflag = nflag = 1;  /* -b implies -n */

所以这看起来像是一个经过深思熟虑的设计决定;的解释-b是,它修改了的行为-n,而不是-b-n是两个互相排斥的替代方案。

答案2

大多数系统命令使用 C 标准库 getopt(3) 或某些变体,并从左到右解析选项。因此,正如您所观察到的,最后一个获胜。

相关内容