kondybas: (100 - мои пять копеек...)
[personal profile] kondybas

Я вчора промудохався півдня, відловлюючи бридкий і складний баг.

Почалось все з того, що в мене перестала працювати скриптова система керування серваком. Видавало щось отакого типу:

Відкриваю катом. Нє, всьо ок:

Відкриваю у `ee` - фєншуйчик!

Ну, думаю, відкрию редактором `le`! А там все теж зашибись:

Відкриваю у встроєному редакторі `deco` - і знов невдача!

Ах, ти ж! - думаю, а єслі у вінді? Перекидаю у FAR - благолєпіє повне:

А шо ще в мене є під рукою? Ага! Ще більш-менш є more-less! Ага, спіймався, падлюка!

Ну, і канєшно ж у `vi` цю холєру вдалося ампутувати:


Після недовгого гугління з'ясувалась причина. Деякі редактори зберігаючи файло у кодуванні 65001 ака UTF8, пхають у перші два байти файлу т.зв. BOM - byte order marker. U+FEFF. Big-endian, little-endian - вот єто вот всьо, вся ета русофобія. Ідея в тому, щоб натикаючись на файло, текстові процесори розуміли, з чим мають справу. Як бачимо, більшість редакторів розуміє це добре, навіть не виводячи цей службовий символ на табло.

Проблема ж в тому, що криворукий тупоголовий уєбан, що вигадав це "покращення", й гадки не мав, що в ніксах текстові файли можуть бути скриптами. І що спецом для цього діла перші два байти кожного скрипта починаються з магічної сигнатури 'шебанг' - #!
Інтерпретатор команд, бачучи ці чарівні символи, читає строчку до кінця, а там має бути прописаний шлях до інтерпретатора тієї скриптової мови, якою написаний наш скрипт. Вигляда це все як `#!/bin/sh`, `#!/usr/local/bin/perl` або `#!/usr/local/bin/php`. Ясний пень, що бачучи во пєрвих строках моєво пісьма FEFF замість #!, інтерпретатору команд стає трохи зле.

Ми всі чудово знаємо, в якій осі екзекутабельність файла визначається не пермішнами, а розширенням, і де такі неявні фокуси із вмістом файлів можуть минати безкарно. От тепер скажіть, що мені даремно хочеться повідривать їм ноги і дать цими ногами по голові!

From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.