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

Cha*_*ens 4 unix command-line cat

我成为 UNIX 用户的时间比我想的要多,在那段时间里,我接受的训练是期望当给一个程序提供矛盾的开关时,最后一个会获胜。最近我注意到

cat -bn file
Run Code Online (Sandbox Code Playgroud)

cat -nb file
Run Code Online (Sandbox Code Playgroud)

两者都-b-n选项(编号所有行)上使用选项(编号非空行)。我在 BSD 和 Linux 上都有这种行为,所以我认为这不是实现上的怪癖。这是在某处指定的东西吗,我是否因为期望第一个示例对所有行进行编号而感到疯狂?

con*_*yer 5

我查看了 cat(1)FreeBSD 源代码,相关的源代码行是:

case 'b':
    bflag = nflag = 1;  /* -b implies -n */
Run Code Online (Sandbox Code Playgroud)

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