如果你看一下你的输出,cal 9 1752
你会看到这个奇怪的输出:
September 1752
S M Tu W Th F S
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Run Code Online (Sandbox Code Playgroud)
以下标题为“ cal 9 1752 解释”的故事是 90 年代初从新闻列表中复制的,并在David G. Wiseman(大学计算机科学系的网络经理)为计算机观众收集的有趣内容下存档西安大略省)。
最初在某些旧版本 7 机器上编写“cal”命令的人在他的代码中出现了一个逐一错误。当 malloc 变量用零覆盖 12 个额外字节时,这表现为一些错误的输出,从而导致上面看到的奇怪的日历输出。
现在,没有人真正关心 1752 年 9 月的日历。甚至1752 年的想法在 UNIX 下都不存在,因为 UNIX 的时间直到 1970 年初才开始。结果,甚至没有人知道“cal "直到很久以后才出现这个错误。到那时,已经有数千个“cal”的副本四处飘散,其中许多只有二进制文件。修复它们为时已晚。
所以在 1975 年年中,AT&T 的一些高级官员会见了教皇,并达成协议。日历被追溯更改,使 1752 年 9 月与 UNIX 现实保持一致。由于历是计数改为向后从1752年9月14日,没有日期后受到了影响。之前的日期都移动了 12 …
如果输出到终端,输出形式 cal 中的当前日期会自动突出显示(反色)。
这就是我一直得到的。
然而,对于我当前的 Debian GNU/Linux,情况不再如此,我想知道修复是什么。
$ echo $TERM
xterm
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux bullseye/sid
Release: testing
Codename: bullseye
Run Code Online (Sandbox Code Playgroud) 我被要求使用cal
命令输出当天。
到目前为止,我发现在当前日期之前有一个_
符号。我决定在grep
这里使用: cal | grep '\b_*'
,但它输出整个星期。我尝试了几种变体,但没有成功。
其实也有一种情况,当日只有一位数,看来我得用在tr -d ' '
这里了。
我不知道如何将所有这些命令组合在一起。
我想在cal
命令的输出中突出显示今天的日期。什么是最好的方法?
这是我到目前为止:
cal -m | grep -C6 --color "$(date +%e)"
Run Code Online (Sandbox Code Playgroud)
但它不适用于所有情况,例如,当日期只有一位数时。我还希望突出显示在我显示一年的日历时起作用。
我想通过颜色cal
或类似命令来强调假期。
我正在使用 OS X 和 Ubuntu 14,是否有简单的方法来启用该功能?
在 Ubuntu 和 Fedora 中,当我cal
在命令行上输入时,我会得到一个 ASCII 日历,其中突出显示了当天。
在 OSX 中,当我输入 时cal
,我得到一个 ASCII 日历,但没有突出显示日期。
如何在 OSX 中突出显示当前日期?
当您在 Linux 上运行 cal 时,当月的输出将反转视频突出显示当天。当我将该输出发送到 hexdump -c 时,我得到了一些有趣的结果:
0000000 N o v e m b e r 2 0 1 6
0000010 \n S u M o T u
0000020 W e T h F r S a \n
0000030 1 2 _ \b _ \b 3
0000040 4 5 \n 6 7
0000050 8 9 1 0 1 1 1 2 \n
0000060 1 3 1 4 1 5 1 6 1 7 1
0000070 8 1 9 \n …
Run Code Online (Sandbox Code Playgroud) 这是一个用例来澄清我的问题。假设我有一个设置为在 中运行的日历程序,~/.bashrc
它确保流输出覆盖相同的行块。
是否可以在不破坏新输入的情况下从后台进程在终端中显示流输出?我已经看过在终端的特定位置显示后台进程的标准输出,但是提问者需要在终止时输出新行,我不需要这样做。
这是程序输出的屏幕截图,当前在前台运行并在输出一次格式化文本后终止:
我只希望格式化的文本不断替换自身,同时允许前台进程正常运行。在 Bash、C 和/或 C++ 中使用类似zsh
或 ANSI 转义序列的解决方案对我来说是完美的。
作为参考,这是我正在使用的当前 C 代码,但如果对您来说更容易,您可以制定一个解决方案来cal
代替:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
const char months[12][10] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
const char weekDays[7][10] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void printCalendar(void);
int getWeekDay(int, int, int, int, int);
int getMaxDay(int, int);
void getDate(int *, int *, int *, int *, int *, int …
Run Code Online (Sandbox Code Playgroud) 我希望运行本文中列出的一些命令,例如:
cal -3
Run Code Online (Sandbox Code Playgroud)
它应该显示上个月,本月和下个月。
该命令没有在OS X中运行
$ cal -3
cal: illegal option -- 3
usage: cal [-jy] [[month] year]
cal [-j] [-m month] [year]
ncal [-Jjpwy] [-s country_code] [[month] year]
ncal [-Jeo] [year]
Run Code Online (Sandbox Code Playgroud)
是否有我可以在 OS X 中使用的替代形式?
以供参考:
$ which cal
/usr/bin/cal
Run Code Online (Sandbox Code Playgroud)
和
$ man cal
Run Code Online (Sandbox Code Playgroud)
表明这可能是默认的 OS X 版本: "...BSD General Commands Manual..."
我是 OpenBSD 用户,我正在编写一个 awk 脚本,它会为我教授的所有课程自动生成 TeX 课程日历。为了从系统中获取实际日历,我使用 Unix cal 命令。问题是 cal 命令的输出使用空格作为分隔符,当我将 nawk 脚本应用于它时,这会产生各种问题。我查看了 cal 的源代码,似乎除了破解源代码之外,没有什么会强制 cal 命令使用空格以外的分隔符。让日历看起来像这样的最简单方法是什么
June 2012
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
Run Code Online (Sandbox Code Playgroud) 根据泽勒的同余论,1600 年 2 月 29 日是星期二。但是,cal 命令将其显示为 Friday.Cal 的代码中是否存在错误,或者 Zeller 的同余可以预测这一天的年份范围是否存在限制。
这是 的输出cal
。<SPACE>
向每个单元格附加一个附加项的最简单方法是什么?
June 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
Run Code Online (Sandbox Code Playgroud)
预期结果:
June 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 …
Run Code Online (Sandbox Code Playgroud)