4

Linux彩蛋:gimme gimme gimme

 2 years ago
source link: http://jandan.net/p/109568
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

新型基因治疗可以治疗数十种罕见病国际货币基金组织贷款与离岸资金流动

投稿 @ 2021.09.07 , 12:10

18

Linux彩蛋:gimme gimme gimme

投稿:Uing

如果你使用 Linux 系统,在大多数的发行版上,在半夜十二点半,打开终端 (Terminal),输入man, 你会看到奇怪的东西:

gimme gimme gimme

这是一个接近十年的彩蛋,也是四年前才被一个开发者发现。

那这个彩蛋是什么意思呢?又是谁这么无聊大半夜一直输入man 去能发现这个彩蛋呢?

一切都从 StackExchange 的一个问题说起。

捷克的开发者Jaroslav Kucera 发现一个奇怪的现象,他的一个集成测试总是在半夜十二点半失败。这个测试一直在运行,而且不依赖外部网路,但总是在 12:30am 这个时间失败。追根溯源后他发现,是因为用了一个命令man -w去获取系统 man 文档的地址。man 是 POSIX 系统的文档帮助命令,是manual的缩写。(有些技术BBS论坛会看到RTFM这个缩写,表示 read the f**king manual,说明你的问题在文档清楚的写着,不要浪费大家的时间)

Jaroslav发现,在任何其他时间,man -w都给给出文档的目录地址,但在12:30am就会出现这个奇怪的信息:

gimme gimme gimme

/usr/local/man:/usr/local/share/man:/usr/share/man

而Jaroslav 的测试脚本默认用第一行作为目录去解析,而ginme ginme ginme显然不是目录,自然就失败了。

很自然地 Jaroslav在 StackExchange 问了这个问题。当然,有问题自然有答案(?),很快 Marnanel 就自首了:

`Dear @colmmacuait, I think that if you type "man" at 0001 hours it should print "gimme gimme gimme". #abba @marnanel - 3 November 2011`

呃,是我的错,我做出的建议。Sorry

基本上Commit的信息就是整个故事。man 的维护者是我的好基友,六年前的时候我开玩笑地建议他如果有人大半夜之后用了man的命令,应该打印出 "gimme gimme gimme" .....

没想到他真的干了,而只有少数人发现了这秘密,我们也快忘记这个事情了,直到今天。

那这个“gimme gimme gimme”到底什么意思呢? Marnanel 回答说因为 Abba 乐队著名的 《gimme gimme gimme! (a man after midnight)》(半夜后给我找一个男人)

Marnanel 也没有想到这会导致任何问题,因为这真的只能是一个彩蛋(不影响关键功能的额外功能),而不是一个bug。

当然,你永远不知道你的用户会怎么用你的产品,例如在另一个事件,Wikimedia发现从印度突然每天向某个图片发来9千万的下载需求,最后发现印度一个开发者在开发App过程中用了Wikimedia的图片链接,只是下载图片但不显示,而这个App 因为中国抖音在印度被封禁而作为替代品流行起来,最后导致Wikimedia遭受无妄之灾。

最后,对着问题的修复就是:man -w不会触发这个彩蛋,其他情况才会。

如何触发这个彩蛋

# date +%T -s "00:30:00"
00:30:00
# man
gimme gimme gimme
What manual page do you want?

源代码

src/man.c-1167- if (first_arg == argc) {
src/man.c-1168- /*
http:twitter.com/#!/marnanel/status/132280557190119424 */
src/man.c-1169- time_t now = time (NULL);
src/man.c-1170- struct tm *localnow = localtime (&now);
src/man.c-1171- if (localnow &&
src/man.c-1172- localnow->tm_hour == 0 && localnow->tm_min == 30)
src/man.c:1173: fprintf (stderr, "gimme gimme gimmen");

commit

赞一个 (11)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK