cal 命令详解与参数实测(Ubuntu 22.04)
cal 命令逐参数实测详解:默认当月、-3 三月连排、-y 全年、-m 指定月份(ncal 变体语义)、-A/-B 上下月、指定年月与 ncal -M/-S 周起始,并实测确认 cal 由 ncal 包提供,全部回显在 Ubuntu 22.04 实测通过。
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 cal util-linux 包 周一为一周之首 cal -m即可GNU gcal gcal 包 独立语法体系 另有专属参数 网上大量「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。两者由同一个程序、同一个包提供。
六、参考链接
- Ubuntu 手册页(ncal/cal 同页):https://manpages.ubuntu.com/manpages/jammy/en/man1/ncal.1.html
- Ubuntu 手册页(cal 条目):https://manpages.ubuntu.com/manpages/jammy/en/man1/cal.1.html
- ncal 包信息:
apt show ncal、man ncal(Ubuntu 22.04 内置)