我试图了解 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
?它是一个程序吗?它是另一个程序的别名吗?它在哪里定义?
谢谢。
答案1
ncal
我可以使用安装的变体重现大部分此类行为cal
:
ls -l /usr/bin/*cal
lrwxrwxrwx 1 root root 4 May 4 2018 /usr/bin/cal -> ncal
-rwxr-xr-x 1 root root 29848 May 4 2018 /usr/bin/ncal
可以使用man cal
(或man ncal
)找到该文档,其中有趣的部分是在描述下,其中写道,
该
cal
实用程序以传统格式显示简单的日历,并ncal
提供替代布局、更多选项和复活节日期
由于cal
和ncal
实际上是同一个程序,因此应用程序必须检查调用它的名称来确定输出布局。进一步调查发现以 开头的名称cal
是例外,使用其他名称(例如ncal
或 )调用程序CAL
会产生“新”输出,其中星期几垂直向下排列:
cal # or any word starting "cal" such as calendar
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
ncal # or 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
现在,至于为什么你看不到CAL
。我的猜测是您使用的文件系统不区分大小写(可能是 NTFS 或 vFAT)。此类文件系统会不分大小写地查找文件匹配项,但也会优先考虑实际存储的文件名的大小写。这里,即cal
。因此,尽管ls /usr/bin/CAL
或which CAL
将匹配并返回 的明显匹配项/usr/bin/CAL
,但由于文件实际被调用,/usr/bin/cal
因此默认ls /usr/bin
将列出该文件。