我使用 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) 或某些变体,并从左到右解析选项。因此,正如您所观察到的,最后一个获胜。