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 замість #!, інтерпретатору команд стає трохи зле.

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

(no subject)

Date: 29 Oct 2016 15:16 (UTC)
From: [identity profile] kondybas.livejournal.com
Спробуй ще раз, фільтр для нефрендів :)