日历程序
我非常痴迷于记录事物。我过去每年都会从当地的电话公司获得一本免费日历。它是我所有约会的完美界面——一本纤薄的螺旋装订日历,我把它放在桌面上,用来记录任何即将到来的约会,以及标记我的朋友和家人的生日。每年假期前后,我都会得到一本新日历,并认真地将生日和其他年度约会重新抄写到新日历中。
几年前,电话公司决定停止发送这些免费日历,但幸运的是,我找到了一个更好的方法。通过使用 cal 和 calendar 程序,我可以将所有旧的模拟日记本抛在脑后。
这些实用程序存在不同的版本。最初是 BSD 实用程序的一部分,后来发布了一个带有某些高级功能的 GNU 版本,名为 gcal。我将重点介绍最初的 BSD 程序,因为它们被广泛使用,并在文章末尾提及其他一些相关程序。
您首先需要通过键入以下内容来找出您的系统上是否安装了这些程序
which cal
如果 which 返回 cal 程序的完整路径名,则表示已安装。如果相反,您立即返回到 shell 提示符,那么您将需要获取并安装此程序。您可以再次使用 which 来查看您是否也安装了 calendar 程序;它们是不同的程序,您将需要这两个程序。
如果您使用 Debian Linux 发行版,则这两个程序都可以在 bsdmainutils 软件包中找到。否则,请查阅您的发行版,或在 http://www.linuxresources.com/apps.html 上搜索 Linux 软件地图。
calendar 是一种基本的提醒服务。它读取当前目录中名为 calendar 的文件,并打印以今天或明天的日期开头的行。 calendar 文件是一个文本文件,可以使用任何文本编辑器创建和编辑。
这个程序比乍一看可能更强大。 calendar 文件条目的一般格式是将月份和日期放在最左侧,后跟一个制表符和提醒文本。月份和日期可以跳过——每行以制表符开头,与前一行的月份和日期值相同。
月份和日期的语法非常多样。为了演示,让我们创建一个示例 calendar 文件,并逐行查看它
10/31 Johnny's Halloween party Friday Garbage day Nov. 20 Dentist appointment, 9:30am 20/11 Mandatory staff meeting, 10:00am January Happy new year! Have you made your resolutions yet? 18 * Rent's due
让我们假设今天是 1997 年 10 月 31 日星期五。在 shell 提示符下,键入
calendar在当前目录中包含示例 calendar 文件的情况下,您将看到此输出
10/31 Johnny's Halloween party Friday Garbage day第一行中的 10/31 告诉 calendar 在 10 月 31 日(或前一天)打印该行,第二行中的 Friday 告诉它(您猜对了)每周五打印。
如您所见,您也可以使用月份的缩写形式,如以 Nov. 20 开头的示例行所示。现在,在第四行中,mm/dd 格式被颠倒了——在这种情况下,calendar 会识别出来,并在 11 月 20 日打印它。以这种格式保存记录可能不是一个好主意。如果您将 5 月 10 日写成 10/5,calendar 将假定您指的是美国的 mm/dd 惯例,并在 10 月 5 日打印该条目。
如果第一列中只有月份名称,calendar 将在该月的第一天打印该条目。如果您通过插入制表符和一些提醒文本来完全消除该列,calendar 将在前一个条目的日期打印该行。因此,在元旦,我们的示例 calendar 将输出
January Happy new year! Have you made your resolutions yet?
最后,用星号代替月份将在每个月的指定日期打印该条目。在我们的示例中,每月 18 号将显示支付租金的提醒。
由于它由 C 预处理器 cpp 预处理,calendar 识别包含文件。这允许您保留和使用特殊列表,例如个人生日列表,而不会使您的主 calendar 文件变得混乱。 calendar 程序附带一组这样的文件,位于 /usr/lib/calendar/ 中,以帮助您入门
calendar.birthday:许多著名历史人物的出生和死亡日期
calendar.computer:计算机历史上的重要日期
calendar.holiday:已知的(和不太知名的)节日
calendar.music:音乐,特别是主流摇滚乐中的重要日期
calendar.christian:基督教节日
calendar.history:许多历史事件
calendar.judaic:犹太节日
calendar.usholiday:美国标准节日
当您使用 include 语句时,calendar 首先搜索调用它的目录,然后查找 /usr/lib/calendar/。在您的文件中包含以下行,
#include <calendar.usholiday>意味着 calendar 将首先在当前目录中查找此类文件。如果不存在,它将检查 /usr/lib/calendar/,如果找到相应的文件,则包含它。
我的旧纸质日历的功能之一是记录和保存我生活中的重要事件记录。我通过将此信息保存在名为 calendar.yyyy 的文件中(例如 calendar.1997)来重现此功能。按顺序查看这些文件可以让我按时间顺序记录我生活中的重大事件,如果我想查看我在特定年份或年份的今天日期左右在做什么,我可以在我的 calendar 文件中为相应的 calendar.yyyy 文件添加 include 语句。
您可以随时运行 calendar,但将其放入您的配置文件中(如果您使用 bash shell,则为 ~/.bash_profile)可能更有用。然后,calendar 将在您每次登录系统时运行。
我将我的个人 calendar 文件保存在我的主目录的 doc/etc/ 子目录中,因此我将在我的配置文件中包含以下行
cd /home/m/doc/etc/; calendar; cd
将相同的行放在您的 .bashrc 文件中(同样,仅当您使用 bash shell 时——其他 shell 不同)也有效,以便在您每次启动 shell 时运行 calendar。
有时甚至 这 也不够——如果您的机器一直开着,并且您没有启动任何新的 shell 或 xterm,您可能会错过提醒。因此,您可以安排一个 cron 作业每天运行 calendar,并将输出通过电子邮件发送给您作为提醒。
cal 程序显示文本日历。如果您在不带任何选项的情况下调用它,键入
cal
当前月份将像这样显示在终端上(假设为 1998 年 9 月)
September 1998 S M Tu W Th F S 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。
cal 1950键入
cal -y将打印当前年份的日历。
cal 还可以显示任何任意月份。例如,如果您想查看 1999 年 12 月的月份,请使用
cal 12 1999
在这种情况下,您将看到
December 1999 S M Tu W Th F S 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 对于创建简单日历非常有用,但有时在打印时您可能需要更美观的输出。pcal 是一个以 PostScript 格式创建非常精美日历的程序。它的选项与 cal 非常相似。它可从 http://garbo.uwasa.fi/unix/pcal.html 获取。
其他以更图形化的方式处理日历功能的程序(并且只能在 X 中使用)包括 ical,网址为 http://www.research.digital.com/SRC/personal/Sanjay_Ghemawat/ical/home.html 和 plan,网址为 http://www.in-berlin.de/User/bitrot/plan.html。基本 UNIX 日历程序有很多变体——请查看 Linux 软件地图以获取更多信息。
通过对这些简单日历程序的功能和灵活性的概述,您也可以将您的模拟日历系统抛在脑后。
