- 00:30에만 자동 테스트가 실패한 이유는
man -w가 예상 밖의 stderr 문자열 gimme gimme gimme를 함께 출력했기 때문임
- 이 문자열은
man의 이스터에그로, 매뉴얼 페이지 없이 실행하거나 -w를 사용할 때 로컬 시간이 00:30이면 나타남
- 문구는 ABBA의 “Gimme! Gimme! Gimme! (A Man After Midnight)”에서 왔고, 2011년 트윗 농담이
man-db 코드에 반영됨
man -w는 manpath를 출력하고 종료 코드도 0이라 자동화에 쓰일 수 있었지만, 이스터에그가 출력 파싱을 깨뜨릴 수 있었음
man-db는 먼저 man -w에서 발동하지 않게 고쳤고, 이후 man-db 2.8.0에서 이스터에그를 완전히 제거하기로 함
00:30에만 실패한 테스트
- 자동 테스트는 대부분의 시간에 정상 동작했지만, 00:30에 실행될 때만 실패함
- 직접적인 원인은
stderr에 예상하지 않은 문자열이 추가된 것이었음
gimme gimme gimme
- 테스트에서 사용한 명령은
man -w였고, 현재 manpath를 얻기 위한 용도였음
man에 들어 있던 이스터에그
- 문제의 문자열은
man 명령에 들어 있던 이스터에그였음
- 발동 조건은 다음과 같았음
- 매뉴얼 페이지를 지정하지 않고
man을 실행함
- 또는
man -w를 실행함
- 로컬 시간이 00:30임
- 조건이 맞으면
stderr에 gimme gimme gimme가 출력됨
# date +%T -s "00:30:00"
00:30:00
# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
원래 기대된 동작
man -w의 정상 출력은 매뉴얼 페이지 검색 경로만 반환하는 것임
# man -w
/usr/local/share/man:/usr/share/man:/usr/man
# echo $?
0
- 페이지 없이
man을 실행하면 어떤 매뉴얼 페이지를 원하는지 묻고 종료 코드 1을 반환하는 것이 기대 동작임
# man
What manual page do you want?
# echo $?
1
man -w는 검색 경로를 출력하므로, 매뉴얼 페이지 설치 확인이나 테스트 자동화의 구성 요소로 쓰일 수 있음
코드와 배포판 범위
- 해당 문자열은 RHEL, OpenSUSE, Fedora, Debian 등에서 발견됐고, 특정 배포판만의 동작은 아니었음
- 바이너리에서 문자열을
grep해 존재 여부를 확인할 수 있었음
- 출력은
man-db의 src/man.c 코드에서 발생했음
time_t now = time (NULL);
struct tm *localnow = localtime (&now);
if (localnow &&
localnow->tm_hour == 0 && localnow->tm_min == 30)
fprintf (stderr, "gimme gimme gimme\n");
ABBA 노래와 트윗에서 온 문자열
gimme gimme gimme는 ABBA의 “Gimme! Gimme! Gimme! (A Man After Midnight)”에서 온 문자열임
- Marnanel Thurman은 2011년 트윗에서
man을 00:01에 실행하면 gimme gimme gimme를 출력해야 한다고 농담으로 제안함
man 유지관리자는 그 제안을 실제 코드에 넣었음
- 초기 커밋은 00:01에 발동했고, 이후 “half past twelve”라는 커밋 메시지와 함께 00:30으로 바뀐 것으로 댓글에서 보충됨
수정과 제거
man-db 유지관리자 Colin Watson은 먼저 man -w에서 이 이스터에그가 발동하지 않도록 84bde8 커밋으로 수정함
- 이후 Colin Watson은 이스터에그를 완전히 제거하는 커밋을 적용함
- 제거된 이스터에그는 예정된 man-db 2.8.0에서 사라질 예정이었음
- 유지관리자는 이스터에그가 일부 사람들에게 웃음을 줬지만 일부에게는 성가셨고, 6년이면 충분히 오래 지속됐다고 판단함