cal 命令详解与参数实测(Ubuntu 22.04)

cal 命令逐参数实测详解:默认当月、-3 三月连排、-y 全年、-m 指定月份(ncal 变体语义)、-A/-B 上下月、指定年月与 ncal -M/-S 周起始,并实测确认 cal 由 ncal 包提供,全部回显在 Ubuntu 22.04 实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行文件管理2026/10/15

cal 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 cal 的每一个参数——默认当月、-3 三月连排、-y 全年、-m 指定月份、-A/-B 上下文月份、指定年月查询与 ncal 紧凑形态(含 -M/-S 周起始),并实测确认 Ubuntu 22.04 的 cal 由 ncal 包提供、同名参数语义与其他实现不同,全部命令与回显已在 Ubuntu 22.04 实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • cal 提供者:ncal 包(dpkg -S 实测,/usr/bin/cal 实为 /usr/bin/ncal,见 2.3)
  • ncal 包版本:12.1.7+nmu3ubuntu2(dpkg -l ncal 实测;cal/ncal 自身不支持 -V/--version,见 2.3)
  • cal 属于 ncal 包,Ubuntu 22.04 预装该包,无需额外安装
  • 系统时区:UTC;实测基准日期:2026 年 10 月(默认输出均为当月 2026-10)
  • 本篇无需准备演示数据,所有实测围绕日历显示展开

二、命令概览

2.1 语法与说明

Ubuntu 22.04 的 cal 有两种显示形态:cal 模式(横排网格,每周一行,经典样式)与 ncal 模式(按星期竖排,紧凑样式),二者由同一程序提供。命令形态如下(实测 usage 原文,来源见 2.2):

Usage: cal [general options] [-jy] [[month] year]
       cal [general options] [-j] [-m month] [year]
       ncal -C [general options] [-jy] [[month] year]
       ncal -C [general options] [-j] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [-W number of days] [[month] year]
       ncal [general options] [-Jeo] [year]
General options: [-31] [-A months] [-B months] [-d yyyy-mm]

要点有三:cal 支持「月 年」或「年」的位置参数;通用选项 -3(前后月连排)、-A n/-B n(后/前 n 个月)两套形态通用;-m 在本实现中是指定月份而不是「周一起始」(与其他发行版 util-linux 的 cal 不同,见 3.4 与 Q2),周一起始要用 ncal 形态的 -M(见 3.7)。

2.2 帮助形态:--help 的实测回显

本实现的 cal/ncal 没有标准的 --help 长选项——实测传入 --help 会报 invalid option 并回显 usage(上面 2.1 的 usage 块即来自该实测输出):

$ cal --help
cal: invalid option -- '-'
Usage: cal [general options] [-jy] [[month] year]
       cal [general options] [-j] [-m month] [year]
       ncal -C [general options] [-jy] [[month] year]
       ncal -C [general options] [-j] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [-W number of days] [[month] year]
       ncal [general options] [-Jeo] [year]
General options: [-31] [-A months] [-B months] [-d yyyy-mm]

usage 首行列出了 cal 的两种参数形态与通用选项,末行汇总通用选项 [-31] [-A months] [-B months] [-d yyyy-mm]。这份 usage 就是本实现的「帮助」,完整参数语义需查 man ncal(man 页覆盖 cal 与 ncal 两个名字)。

💡 提示:见到 cal: invalid option -- '-' 不要以为是装错了,ncal 包的 cal 就是这样设计;想看文档用 man ncal。

2.3 来源与版本确认

先确认 cal 命令的真实来源:which 找到路径,readlink -f 解析真实指向,dpkg -S 反查所属包:

$ which cal
/usr/bin/cal

$ readlink -f $(which cal)
/usr/bin/ncal

$ dpkg -S $(readlink -f $(which cal))
ncal: /usr/bin/ncal

/usr/bin/cal 解析后指向 /usr/bin/ncal,且 /usr/bin/ncal 属于 ncal 包——Ubuntu 22.04 上的 cal 由 ncal 包提供。再尝试获取版本号,cal/ncal 均不支持 -V:

$ cal -V
cal: invalid option -- 'V'
Usage: cal [general options] [-jy] [[month] year]
       cal [general options] [-j] [-m month] [year]
       ncal -C [general options] [-jy] [[month] year]
       ncal -C [general options] [-j] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [-W number of days] [[month] year]
       ncal [general options] [-Jeo] [year]
General options: [-31] [-A months] [-B months] [-d yyyy-mm]

$ ncal -V
ncal: invalid option -- 'V'
Usage: cal [general options] [-jy] [[month] year]
       cal [general options] [-j] [-m month] [year]
       ncal -C [general options] [-jy] [[month] year]
       ncal -C [general options] [-j] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [-W number of days] [[month] year]
       ncal [general options] [-Jeo] [year]
General options: [-31] [-A months] [-B months] [-d yyyy-mm]

版本号改由包管理器查询:

$ dpkg -l ncal | tail -1
ii  ncal           12.1.7+nmu3ubuntu2 amd64        display a calendar and the date of Easter

$ apt policy ncal 2>/dev/null | head -3
ncal:
  Installed: 12.1.7+nmu3ubuntu2
  Candidate: 12.1.7+nmu3ubuntu2

两条命令一致确认:ncal 包版本 12.1.7+nmu3ubuntu2。

三、参数逐项实测

3.1 默认用法:当月日历

不带任何参数,cal 显示当前月份的横排网格,周日(Su)为一周之首:

$ cal
    October 2026      
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  
                      

首行是月份与年份,第二行是星期表头,10 月 1 日落在周四(Th)。交互终端里「今天」(10-15)会有反白高亮,纯文本留档中不可见。

💡 提示:cal 的输出是等宽对齐的固定宽度网格(含行尾补齐空格),管道处理时按列切分即可,行尾空格不影响解析。

3.2 -3:上月、本月、下月连排

-3(three months)一次显示前一个月、当月、后一个月的三栏日历:

$ cal -3
   September 2026         October 2026         November 2026      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
       1  2  3  4  5               1  2  3   1  2  3  4  5  6  7  
 6  7  8  9 10 11 12   4  5  6  7  8  9 10   8  9 10 11 12 13 14  
13 14 15 16 17 18 19  11 12 13 14 15 16 17  15 16 17 18 19 20 21  
20 21 22 23 24 25 26  18 19 20 21 22 23 24  22 23 24 25 26 27 28  
27 28 29 30           25 26 27 28 29 30 31  29 30                 
                                                                  

三个月横向并排,方便对照跨月的排期与周数(如 9-28 与 10-1 同周、10-26 与 11-1 同周)。

💡 提示:-3 等价于 -B 1 -A 1(各显示前/后 1 个月),见 3.5 的输出对照。

3.3 -y:全年日历

-y(year)显示整年 12 个月,按每行 3 个月排成 4 行大网格:

$ cal -y
                            2026
      January               February               March          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
             1  2  3   1  2  3  4  5  6  7   1  2  3  4  5  6  7  
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   8  9 10 11 12 13 14  
11 12 13 14 15 16 17  15 16 17 18 19 20 21  15 16 17 18 19 20 21  
18 19 20 21 22 23 24  22 23 24 25 26 27 28  22 23 24 25 26 27 28  
25 26 27 28 29 30 31                        29 30 31              
                                                                  

       April                  May                   June          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
          1  2  3  4                  1  2      1  2  3  4  5  6  
 5  6  7  8  9 10 11   3  4  5  6  7  8  9   7  8  9 10 11 12 13  
12 13 14 15 16 17 18  10 11 12 13 14 15 16  14 15 16 17 18 19 20  
19 20 21 22 23 24 25  17 18 19 20 21 22 23  21 22 23 24 25 26 27  
26 27 28 29 30        24 25 26 27 28 29 30  28 29 30              
                      31                                          

        July                 August              September        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
          1  2  3  4                     1         1  2  3  4  5  
 5  6  7  8  9 10 11   2  3  4  5  6  7  8   6  7  8  9 10 11 12  
12 13 14 15 16 17 18   9 10 11 12 13 14 15  13 14 15 16 17 18 19  
19 20 21 22 23 24 25  16 17 18 19 20 21 22  20 21 22 23 24 25 26  
26 27 28 29 30 31     23 24 25 26 27 28 29  27 28 29 30           
                      30 31                                       

      October               November              December        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
             1  2  3   1  2  3  4  5  6  7         1  2  3  4  5  
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   6  7  8  9 10 11 12  
11 12 13 14 15 16 17  15 16 17 18 19 20 21  13 14 15 16 17 18 19  
18 19 20 21 22 23 24  22 23 24 25 26 27 28  20 21 22 23 24 25 26  
25 26 27 28 29 30 31  29 30                 27 28 29 30 31        
                                                                  

全年规划、节假日分布一屏看完。

💡 提示:cal -y 显示的是当前年份;查其他年份直接传位置参数「年」(如 cal 2026)或用 3.6 的「月 年」形态。

3.4 -m:指定月份(本实现语义)

注意:Ubuntu 22.04 的 ncal 实现里,cal 模式的 -m 是「显示指定月份」,需要参数;不带参数会报错:

$ cal -m
cal: option requires an argument -- 'm'
Usage: cal [general options] [-jy] [[month] year]
       cal [general options] [-j] [-m month] [year]
       ncal -C [general options] [-jy] [[month] year]
       ncal -C [general options] [-j] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [-W number of days] [[month] year]
       ncal [general options] [-Jeo] [year]
General options: [-31] [-A months] [-B months] [-d yyyy-mm]

-m 后接月份数字或月份名(全称、三字母缩写均可):

$ cal -m 10 2026
    October 2026      
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 -m September 2026
   September 2026
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


$ cal -m Sep 2026
   September 2026
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

cal -m 10 2026 与 cal 10 2026 输出一致(都是显示 2026 年 10 月);-m September 与 -m Sep 均正确解析为 9 月。

💡 技术拓展:-m 的语义在不同 cal 实现中并不相同——

实现提供方-m 语义周一起始
ncal(本机实测)ncal 包(FreeBSD/NetBSD 系)显示指定月份(cal -m 10 2026)ncal 形态的 -M(见 3.7)
util-linux calutil-linux 包周一为一周之首cal -m 即可
GNU gcalgcal 包独立语法体系另有专属参数

网上大量「cal -m 周一起始」的教程写的是 util-linux 的语义;在 Ubuntu 22.04 上照抄会得到 option requires an argument 报错(见上方实测)。判断本机属于哪种实现:readlink -f $(which cal) 指向 /usr/bin/ncal 即本例的 ncal 系。

3.5 -A 1 -B 1:上下文月份

通用选项 -A n 显示当月之后 n 个月,-B n 显示之前 n 个月,可单独或组合使用。实测 -A 1 -B 1:

$ cal -A 1 -B 1
   September 2026         October 2026         November 2026      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
       1  2  3  4  5               1  2  3   1  2  3  4  5  6  7  
 6  7  8  9 10 11 12   4  5  6  7  8  9 10   8  9 10 11 12 13 14  
13 14 15 16 17 18 19  11 12 13 14 15 16 17  15 16 17 18 19 20 21  
20 21 22 23 24 25 26  18 19 20 21 22 23 24  22 23 24 25 26 27 28  
27 28 29 30           25 26 27 28 29 30 31  29 30                 
                                                                  

输出与 3.2 的 cal -3 完全一致——-3 就是 -B 1 -A 1 的快捷写法。-A/-B 的价值在于跨度可调:需要显示前两个月就写 -B 2。

3.6 指定年月:位置参数

cal 月 年 直接查询任意月份,cal 年 查询整年;实测「月 年」形态:

$ cal 10 2026
    October 2026      
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 12 2026
   December 2026      
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 2026),效果同 cal -y 但不限当前年。

3.7 ncal 形态:竖排布局与周起始 -M/-S

ncal 命令与 cal 同源,但按「星期竖排、日期横排」的紧凑布局显示:

$ ncal
    October 2026      
Su     4 11 18 25   
Mo     5 12 19 26   
Tu     6 13 20 27   
We     7 14 21 28   
Th  1  8 15 22 29   
Fr  2  9 16 23 30   
Sa  3 10 17 24 31   

$ ncal -3
    September 2026    October 2026      November 2026     
Su     6 13 20 27        4 11 18 25     1  8 15 22 29   
Mo     7 14 21 28        5 12 19 26     2  9 16 23 30   
Tu  1  8 15 22 29        6 13 20 27     3 10 17 24      
We  2  9 16 23 30        7 14 21 28     4 11 18 25      
Th  3 10 17 24        1  8 15 22 29     5 12 19 26      
Fr  4 11 18 25        2  9 16 23 30     6 13 20 27      
Sa  5 12 19 26        3 10 17 24 31     7 14 21 28      

ncal 形态支持 -M(周一起始)与 -S(周日起始):

$ ncal -M 10 2026
    October 2026
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31
Su  4 11 18 25

$ ncal -S 10 2026
    October 2026
Su     4 11 18 25
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31

ncal -M 的表头从 Mo 开始、周日排在末行;ncal -S 与默认一致(Su 起始)。在 cal 模式下 -M/-S 不可用(实测报 usage,见 Q1),需要周一起始就写 ncal -M。

四、实战示例

4.1 跨月排期核对

项目排期跨月时,三月连排一眼看清同一自然周的日期分布:

$ cal -3
   September 2026         October 2026         November 2026      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
       1  2  3  4  5               1  2  3   1  2  3  4  5  6  7  
 6  7  8  9 10 11 12   4  5  6  7  8  9 10   8  9 10 11 12 13 14  
13 14 15 16 17 18 19  11 12 13 14 15 16 17  15 16 17 18 19 20 21  
20 21 22 23 24 25 26  18 19 20 21 22 23 24  22 23 24 25 26 27 28  
27 28 29 30           25 26 27 28 29 30 31  29 30                 
                                                                  

跨度可调:-A 1 -B 1 与 -3 等效(见 3.5),前后更多月就调大数字。

4.2 查历史/未来某月的星期分布

确认某年某月 1 日是星期几、当月有几天,直接传「月 年」:

$ cal 10 2026
    October 2026      
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 12 2026
   December 2026      
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        
                      

2026-10-01 是周四、2026-12-01 是周二,从网格直接可读。

4.3 全年节假日规划

$ cal -y
                            2026
      January               February               March          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
             1  2  3   1  2  3  4  5  6  7   1  2  3  4  5  6  7  
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   8  9 10 11 12 13 14  
11 12 13 14 15 16 17  15 16 17 18 19 20 21  15 16 17 18 19 20 21  
18 19 20 21 22 23 24  22 23 24 25 26 27 28  22 23 24 25 26 27 28  
25 26 27 28 29 30 31                        29 30 31              
                                                                  

(输出节选,实测首尾;完整 12 个月回显见 3.3。)排长假与发布冻结窗口时,全年 12 个月网格比逐月查快得多。

4.4 紧凑视图与周一起始

偏好竖排或需要周一起始的读者,直接用 ncal 形态:

$ ncal -M 10 2026
    October 2026
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31
Su  4 11 18 25

Mo 在首行、Su 在末行,符合国内「周一第一天然周」的阅读习惯。

五、注意事项与常见问题

Q1:cal -M 10 2026 报 usage 错误? Ubuntu 22.04 的 cal 来自 ncal 包(见 2.3 实测),-M/-S 是 ncal 形态的选项(usage 中只出现在 ncal 参数行),cal 模式不支持,实测传给 cal 直接回显 usage。要周一起始,改用 ncal -M 10 2026(见 3.7 实测)。

Q2:教程说 cal -m 是周一起始,为什么本机要求参数? 实现差异。util-linux 版 cal 的 -m 才是周一起始;本机 ncal 版的 -m 是「显示指定月份」,必须带月份参数(见 3.4 实测:不带参数报 option requires an argument,cal -m 10 2026 正常显示 10 月)。判断方法:readlink -f $(which cal) 指向 /usr/bin/ncal 即 ncal 系实现。

Q3:cal 怎么查版本号? cal/ncal 均不支持 -V 与 --version(见 2.3 实测,均回显 usage)。版本走包管理器:dpkg -l ncal 或 apt policy ncal,实测本机为 12.1.7+nmu3ubuntu2。

Q4:cal -3 和 cal -A 1 -B 1 是什么关系? 输出完全一致(对比 3.2 与 3.5 的实测回显可证)。-3 是固定的「前 1 本月 后 1」,-A n/-B n 是可调跨度的一般形式;只需要前后各一个月用哪个都行。

Q5:cal 位置参数的顺序是什么? 「月在前、年在后」:cal 10 2026 显示 2026 年 10 月(见 3.6)。只传一个数字时按年份解释(cal 2026 显示整年)。写反了会把月当成年、年当成年导致显示错误或报错。

Q6:cal 与 ncal 的输出布局有何区别?该用哪个? cal 是经典横排网格(每周一行,见 3.1),ncal 是按星期竖排的紧凑布局(每行一个星期几,见 3.7)。日常看日历用 cal;需要周起始可调(-M/-S)、儒略日(-j)、复活节日期等扩展能力时用 ncal。两者由同一个程序、同一个包提供。

六、参考链接