我试图了解 Bash 如何执行命令。当我运行时cal
,我看到了这个:
December 2021
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
但是,当我运行时CAL
,我看到了:
December 2021
Mo 6 13 20 27
Tu 7 14 21 28
We 1 8 15 22 29
Th 2 9 16 23 30
Fr 3 10 17 24 31
Sa 4 11 18 25
Su 5 12 19 26
由于结果略有不同,我假设两个单独的程序正在运行。当我跑的时候which cal
,我看到了/usr/bin/cal
。当我跑的时候which CAL
,我看到了/usr/bin/CAL
。但是,当我运行时,ls -l /usr/bin
我没有CAL
看到列出的条目。
是什么CAL
?它是一个程序吗?它是另一个程序的别名吗?它在哪里定义?
谢谢你。
ncal
我可以使用安装的变体重现大部分这种行为cal
:文档可以用
man cal
(orman ncal
) 找到,有趣的部分在它所写的说明下,由于
cal
和ncal
实际上是同一个程序,因此应用程序必须检查调用它的名称以确定输出布局。进一步调查确定以 开头的名称cal
是例外,并以其他名称调用程序,例如ncal
或CAL
产生“新”输出,一周中的天数垂直向下运行:现在,至于为什么看不到
CAL
。我的猜测是您使用的是不区分大小写的文件系统(可能是 NTFS 或 vFAT)。无论大小写如何,这样的文件系统都会找到与文件匹配的文件,但也会更喜欢实际存储的文件名的大小写。在这里,就是cal
。因此,尽管ls /usr/bin/CAL
orwhich CAL
将匹配并返回一个明显的匹配到/usr/bin/CAL
,因为该文件实际上是被调用/usr/bin/cal
的,这就是默认ls /usr/bin
将列出的内容。