UNIXのmanコマンドに6年間誰にも気付かれずに眠っていたイースターエッグとは?
UNIX系OSにはコマンドや関数の使い方を記したmanページが用意されており、manコマンド(mandb)を用いてmanページの内容を閲覧できます。このmanコマンドには、とあるイースターエッグが仕込まれていましたが、2017年に削除されています。
date - Why does man print "gimme gimme gimme" at 00:30? - Unix & Linux Stack Exchange
このイースターエッグは、2017年にエンジニア向けのQ&AサービスであるStackExchangeに投稿された質問で発覚しました。
投稿者は「manコマンドを0時30分に実行すると、『gimme gimme gimme』というメッセージが表示されてエラーとなります。他の時間であれば正常に動作します。なぜこのような出力結果になるのでしょうか?」と質問しました。
manコマンドを実行した時に得られる正しい出力結果は以下のようになります。
# man -w
/usr/local/share/man:/usr/share/man:/usr/man
# echo $?
0
# man
What manual page do you want?
# echo $?
1
そして、0時30分にmanコマンドを実行して失敗した時のメッセージが以下。
# date +%T -s "00:30:00"
00:30:00
# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
この質問に対し、マーナネル・サーマン氏が「えっと、私が提案したせいです。ごめんなさい」と謝罪のコメントを投稿しました。
サーマン氏によると、このイースターエッグがmandbに提案されたのは2011年のことで、コミットメッセージが以下に残っています。
Easter egg suggested by Thomas Thurman. - man-db.git - Database-driven manual pager suite
https://git.savannah.nongnu.org/cgit/man-db.git/commit/src/man.c?id=002a6339b1fe8f83f4808022a17e1aa379756d99
サーマン氏はman-dbのメンテナーであるコリン・ワトスン氏と友人で、ある日に冗談で「真夜中過ぎにmanを呼んだら『gimme gimme gimme』と表示されるべきだ」と述べたとのこと。これは、スウェーデンのポップバンド・ABBAの名曲「Gimme! Gimme! Gimme! (A Man After Midnight)」とひっかけたジョークです。
ABBA - Gimme! Gimme! Gimme! (A Man After Midnight) - YouTube
この曲は、夜中に一緒にいてくれる男性がいてほしいと願う女性の心境を歌ったもの。タイトルならびにサビで歌われる「gimme gimme gimme A Man After Midnight」という部分は、まさに「真夜中を越えたあたりで男がいてほしいの」というメッセージになっています。そのため、ちょうど真夜中を越えた0時30分にmanコマンドを実行すると、「gimme gimme gimme」と返ってくるというわけです。
サーマン氏によると、「このイースターエッグが何らかの問題を引き起こすとは思っていませんでした」とのことで、6年越しにイースターエッグが発見されるまで本人たちもすっかり実装していたことを忘れていたそう。
その後、ワトスン氏はイースターエッグをオプションや引数なしで「man」コマンド単体で実行した場合にのみに限定し、実用的な場面でエラーを起こさないように修正しました。
Stop Easter egg interfering with non-error cases - man-db.git - Database-driven manual pager suite
https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=84bde8d8a9a357bd372793d25746ac6b49480525
さらに修正から1日後、ワトスン氏は「結局、この質問の目的は笑顔で、何人かの人が笑顔になってくれたのは嬉しく思いますし、Twitterの通知を見るとほとんどの人が迷惑というよりは面白いと思っていたようです。それでも、迷惑だと感じた人もいましたし、6年というのはジョークの賞味期限としてはなかなか良い期間だったと思います」とStackExchangeで述べ、このイースターエッグを完全に削除しました。
Remove Easter egg entirely - man-db.git - Database-driven manual pager suite
https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225d9e76fbb0a6a4539c0992fba88c83f0bd37e