Почему человек печатает “дай дай дай” в 00:30?

Вопрос или проблема

Мы заметили, что некоторые наши автоматические тесты не проходят, когда они запускаются в 00:30, но в остальное время дня работают нормально. Они завершаются с сообщением

gimme gimme gimme

в stderr, чего не ожидали. Почему мы получаем такой вывод?

Уважаемый @colmmacuait, я думаю, что если вы наберете “man” в 0001 часов, он должен вывести “gimme gimme gimme”. #abba
@marnanel – 3 ноября 2011

Эм, это была моя ошибка, я это предложил. Извините.

Практически вся история находится в коммите. Соуправляющий man – мой хороший друг, и однажды шесть лет назад я в шутку сказал ему, что если вызвать man после полуночи, он должен напечатать “gimme gimme gimme“, из-за песни группы Abba под названием “Gimme gimme gimme a man after midnight“:

Что ж, он действительно включил это в. Несколько человек были удивлены, обнаружив это, и мы в основном забыли об этом до сегодняшнего дня.

Я не могу говорить за Кола, но я не ожидал, что это когда-либо вызовет какие-либо проблемы: какой тест мог бы сломаться при разборе вывода man без указанной страницы? Я полагаю, не стоит удивляться, что такой тест в итоге появился, но на это ушло шесть лет.

сообщении коммита меня называют Томасом, что является моим юридическим именем, хотя я его не использую в интернете часто.)

Эта проблема была исправлена в коммите 84bde8: Запуск man с man -w больше не будет вызывать этот пасхальный яйцо.

Это пасхальное яйцо в man. Когда вы запускаете man без указания страницы или с -w, он выводит “gimme gimme gimme” в stderr, но только в 00:30:

# date +%T -s "00:30:00"
00:30:00
# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man

Код выхода всегда 0.

Правильный вывод всегда должен быть:

# man -w
/usr/local/share/man:/usr/share/man:/usr/man
# echo $?
0
# man
Какую справочную страницу вы хотите?
# echo $?
1

Строка “gimme gimme gimme” встречается в RHEL, OpenSUSE, Fedora, Debian и, вероятно, в других дистрибутивах, так что она не специфична для какого-то конкретного дистрибутива. Вы можете grep ваш бинарный файл man, чтобы это проверить.

Этот код отвечает за вывод, добавленный в этот коммит:

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 gimme\n");

Я связался с поддержкой RHEL по этому вопросу.

Строка появилась из известной песни ABBA Gimme! Gimme! Gimme! (A Man After Midnight).


Разработчик man-db, Колин Уотсон, решил, что веселости достаточно, и история не будет забыта, и полностью удалил пасхальное яйцо.

Спасибо, Колин!

После некоторых раздумий я удалил это пасхальное яйцо. Оно исчезнет в следующей версии man-db 2.8.0.

Я рад, что это заставило некоторых людей улыбнуться, что в конце концов и было его основной целью, и мои уведомления в Twitter и так далее сегодня показывают, что большинство людей считывали это более забавным, чем раздражающим. Тем не менее, некоторым людям это действительно казалось раздражающим, и шесть лет – это, кажется, довольно хороший срок для такого рода вещей; вряд ли это получит значительно большее внимание, чем то, что уже неожиданно появилось благодаря этому вопросу. Пора положить этому конец.


Ответ или решение

Данный вывод "gimme gimme gimme" в stderr при запуске команды man без указания конкретной страницы или с использованием опции -w в 00:30 часов является так называемым "пасхальным яйцом", добавленным разработчиком программы man в рамках веселья и шутки. Это связано с известной песней группы ABBA "Gimme! Gimme! Gimme! (A Man After Midnight)".

Согласно коду, который был добавлен в коммите шесть лет назад, команда man проверяет текущее время и, если оно совпадает с 00:30, выводит "gimme gimme gimme" в stderr. Конкретно в коде это реализовано следующим образом:

if (localnow && localnow->tm_hour == 0 && localnow->tm_min == 30)
    fprintf(stderr, "gimme gimme gimme\n");

Это сообщение предназначалось для создания легкой и непринужденной атмосферы, и оно не вызывало проблем до тех пор, пока не появились автоматизированные тесты, которые начали зависеть от вывода команды man.

Согласно коммиту, который зафиксировал это изменение, многие пользователи находили это веселым, но со временем некоторые пользователи стали считать это раздражающим. Поэтому в обновлении man-db версии 2.8.0 данное "пасхальное яйцо" было удалено.

Если ваша автоматизированная тестовая система не ожидает увидеть этот выходной текст, вы можете просто обновить программу man до последней версии, чтобы устранить эту проблему. В противном случае, вы можете добавить логику в ваши тесты, чтобы игнорировать этот специфический вывод, если он будет встречаться в 00:30.

В заключение, причина, по которой выводится "gimme gimme gimme" в 00:30, заключается в реализации шутливого элемента в коде программы man, который, однако, впоследствии был убран из-за его потенциальной помехи в автоматизированных тестах.

Оцените материал
Добавить комментарий

Капча загружается...