Bash Shell 中区分大小写的命令

Bash Shell 中区分大小写的命令

我试图了解 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提供替代布局、更多选项和复活节日期

由于calncal实际上是同一个程序,因此应用程序必须检查调用它的名称来确定输出布局。进一步调查发现以 开头的名称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/CALwhich CAL将匹配并返回 的明显匹配项/usr/bin/CAL,但由于文件实际被调用,/usr/bin/cal因此默认ls /usr/bin将列出该文件。

相关内容