Shebang myth
Sep. 16th, 2010 01:47 pmЗапишу-ка ссылку, чтобы снова не забыть. А то уже дважды терял, приходилось искать заново.
The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours
Исполняемые файлы в Unix могут быть не только бинарными, содержащими машинные инструкции для процессора, но и скриптами, для интерпретации которых запускается специальная программа. Различает их система не по расширению, как в Windows (.com и .exe — бинарные, .bat и .cmd — скрипты), а по нескольким первым байтам файла (в Windows тоже .com и .exe друг от друга отличаются по началу файла, расширение роли не играет). Если файл начинается с последовательности символов "#!" (на жаргоне её называют shebang) — это скрипт. Дальше и до конца первой строки должно идти (абсолютное) имя файла, содержащего программу-интерпретатор скрипта (возможно с параметрами).
И этот интерпретатор не обязательно должен быть стандартным интерпретатором sh. Это может быть sed, awk, make, perl, python, tcl, php, ruby — интерпретатор любого языка, воспринимающий "#" в начале строки как комментарий (вот поэтому "#" так популярен для обозначения комментариев). По крайней мере воспринимающий "#!" в начале первой строки как комментарий. Чтобы проигнорировать сам shebang.
Любопытен миф, возникший в связи с shebang-ом. Говорят, дескать на каких-то системах (никто сам на них не работал, но говорят), для опознания типа файла используется 32-битное начальное число. А значит, скрипты распознаются по первым четырём символам. Абсолютное имя интерпретатора начинается с "/", а дальше уже молут идти разные символы, поэтому между "#!" и "/" обязательно должен вставляться один и только один пробел. Иначе магия не сработает. По данной ссылке, содержащей интересные подробности о истории и ограничениях shebang-а на разных платформах, в том числе развенчивается и этот миф.
no subject
Date: 2010-09-16 11:59 am (UTC)Если вы готовы терпеть, что первая строчка вашего командного файла будет отэхана на консоль, то это делается так:
Где файл #!.bat содержит три символа @%* (в моём консольном шрифте это напоминает лежащую на боку шляпу волшебника). К сожалению, если ваш язык понимает в качестве комментариев именно # и ничего больше, то избавиться от эха первой строчки, похоже, нельзя. Если вы пользуетесь лиспом, где комментарии традиционно начинаются с точки с запятой, вам повезло немного больше:
Правда, тут всё зависит от того, как именно данный конкретный лисп обращается с пробелами в командной строке. Из трёх имеющихся у меня сейчас без проблем отработал только newlisp; clisp вообще не сумел найти себя внутри каталога с пробелом в имени, а racket запустился, но не смог правильно разобрать строчку аргументов вида a b "c d" (увидел четыре, а не три).
... Чёрный кофе с молоком и яичница всмятку ...
no subject
Date: 2010-09-16 12:24 pm (UTC)Главное, бессмысленное, ведь можно же просто рядом с
something.lispположитьsomething.cmd, в котором:@newlisp something.lisp %*Ну или как там можно вставить имя текущего скрипта с заменой
.cmdна.lisp.И гложут меня смутные подозрения, что в современной Windowds таки можно проассоциировать файл не только в gui. По крайней мере в XP они очень сильно продвинулись насчёт шелла, а в Vista ещё добавили.
no subject
Date: 2010-09-16 01:28 pm (UTC)Один файл -- это не два файла, один файл гораздо более maintainable.
Это да, это действительно обесценивает идею. У меня, собст-но, все часто используемые интерпретаторы проассоциированы (штук пять, но я маньяк ;-). (/me смотрит в %PATHEXT%) А, нет, всего три, не считая стандартных виндовых. То есть реально я пишу скрипты на трёх языках, остальные так, поиграться.
... Я не приобрёл ещё достаточно невежества ...
no subject
Date: 2010-12-03 08:50 pm (UTC)