Człowiek jak się nudzi to mu różne pomysły do głowy przychodzą. No i trafiło tak, że jeden wariat wpadł na pomysł, że trzeba zobaczyć czy to na prawdę takie trudne wypluć napis na STDOUT w niejakim Brainfucku. Po pierwsze trzeba wiedzieć jak to to działa, spojrzenie do Wikipedia: Brainfuck i wychodzi, że banał. Z odpalaniem też nie ma problemu, bo od czego serwisy jak Ideone.
I już było się czym bawić różnej maści „hello worldami”, wszystkie działały (pierwsze wrażenie nie było mylne, banał jak nic, każdy kto próbował sam wie) ale sam kod się zmieniał z pierwotnego który był gigantyczny do ostatecznego, gdzie odkryto na nowo koł^W pętlę.
No tak tylko to zabawa na 45 minut, a później już nie bardzo jest po co, bo co najwyżej można zmieniać mechanicznie tekst do wyświetlenia, a to już nudne. W kolejnej iteracji...
wariat wymyślił, że skoro to takie proste aka mechaniczne, to zamiast wracać do nudy (a RSSy w czytniku się nie zdążyły napełnić) trzeba sobie wyperlować skrypt który na wejściu dostanie coś we wspólnym, a na wyjściu zapoda w wersji cudacznej. Taki skrypt ma tę zaletę, że może zająć dowolnie dużo czasu, bo zawsze coś można poprawić, albo w tym jak działa, albo w tym co wywala, żeby ładniej wyglądało. I tak dzień (nudna część dnia) upłynął. Na koniec trzeba było, jakoś to genialne dzieło nazwać, bo b-2.pl to nazwa fajna, ale mało mówiąca, tuż przed zamknięciem komputera wydano zatem komendę:
$ mv b-1.pl Brainf\*\*k-1.pl
$ mv b-2.pl Brainf\*\*k-2.pl
I do domu, do hackera. Ten po jakimś czasie poszedł spać, a my dochodzimy do finału bo oto...
O ile ponowne otwarcie skryptu w gedit w celu dokonania ostatecznych poprawek nie stanowiło problemu, o tyle próba uruchomienia paskudy zwijała terminal. Ten zdychał kiedy proszono go o autouzupełnienie nazwy skryptu z gwiazdką w nazwie. Już chciałem otwierać buga na GNOME bugzilla ale dla pewności jeszcze pingnąłem smoka, bo on ma zawsze najnowsze wersje wszystkiego więc jest dobrym testem na bugi wykryte ale nie wiadomo czy już nie poprawione. Dzięki temu genialnemu w swej prostocie posunięciu okazało się, że bug i owszem jest, ale nie w gnome-terminal, a w bashu, który zwija się z SIGSEGV w opisanym powyżej przypadku. Kto nie wierzy sam może sprawdzić:
cartoon@ratajczaka /tmp $ bash
cartoon@ratajczaka /tmp $ PS1="(new) ${PS1}"
(new) cartoon@ratajczaka /tmp $ touch test\*1
(new) cartoon@ratajczaka /tmp $ touch test\*2
(new) cartoon@ratajczaka /tmp $ chmod +x test*
(new) cartoon@ratajczaka /tmp $ ls test*
test*1 test*2
(new) cartoon@ratajczaka /tmp $ ./test\*Segmentation fault
cartoon@ratajczaka /tmp $
Bug więc poszedł, ale w kierunku bash-bug ML. Poszedł o 22:17: bash killed by filecompletion feature if filename(s) contain '*' character, jednocześnie Smoku założył błąd w bubuntowym Launchapadzie. Na poprawkę długo nie trzeba było czekać. Prymitywny patch leczący kłopota pojawił się na liście dyskusyjnej 10 minut wcześniej bo o 22:07: Re: bash killed by filecompletion... (PATCH) (no dobra 6 stref czasowych dalej to było :D). Patch prymitywny ale działa.
A jaki jest morał z tej historii? Nie ma morału, ale są dwa wnioski:
Po wykonaniu "chmod +x test*" w Ubuntu 9.10_x64 spowodowało restart Xservera :) Wszystko zgasło i po chwili pokazał się ekran logowania.
Pod Mac OS X 10.5 nie udalo mi sie tego zreprodukowac w bashu...
restart xservera? Myślę, że to przypadek, bo zabija przecież ytlko tego basha który jest na wierzchu. Myślę, że to jakiś kosmiczny przypadek lub inny bug jakowyś.
Co do basha w makówce, możliwe, przecież jest tego więcej niż jedna wersja, nie mam pojęcia w jakich błąd występuje i z jakimi patchami pojawia się w japku. U mnie 4.0.35 i u smoka (zakładam najnowszy dostępny w najniestabilniejszym ever repo bubuntu :D) się wykłada i tylko tego jestem pewien. Po nałożeniu patcha z bashbug ML problem ustępuje.
OS X 10.5 uzywa basha w wersji 3.2.17(1)