True One Shell
Jan. 19th, 2025 02:59 pmДуже давно помітив якусь дивну хєрню у будь-яких скриптах для *nix, особливо якщо їх написано на perl, python чи ruby. Не читають йолопи вимоги стандарту і не тільки. Найпопулярніші зайві рухи це використовувати задля шебангу /usr/bin/env.
Запустіть інтерпретатори perl чи ruby з опцією --help і там побачите строку на кшталт:
-x[directory] ignore text before #!perl line (optionally cd to directory)
це означатиме, що якщо ви, наприклад у Windows ви створите batch-файл, де першими строками буде щось таке:
@echo off
perl -x %~f0 %*
goto :eof
#!perl
То запуститься cmd.exe, що запустить perl з флагом "-x" і по goto :eof закінчить виконання скрипту, а інтерпретатор perl текст, що призначений для cmd.exe, ігноруватиме до "#!perl". Аналогічно для ruby. З python трохи складніше, бо його інтерпретатор проігнорує лише першу строку, тому для cmd.exe перша строка:
@python -x %~f0 %* & goto :eof
А як же *nix? А стандарт треба читати. Якщо у скрипті немає шебангу "#!" то система запустить Єдиний та Неповторний Шел -- True One Shell, тобто /bin/sh. Це те, що нам і треба! Перша строка для python:
exec python -x "$0" ${1+"$@"}; exit # exit, якщо система не знайшла python.
Ну, шо? То як вам хєрня від бородатого гакера?
Запустіть інтерпретатори perl чи ruby з опцією --help і там побачите строку на кшталт:
-x[directory] ignore text before #!perl line (optionally cd to directory)
це означатиме, що якщо ви, наприклад у Windows ви створите batch-файл, де першими строками буде щось таке:
@echo off
perl -x %~f0 %*
goto :eof
#!perl
То запуститься cmd.exe, що запустить perl з флагом "-x" і по goto :eof закінчить виконання скрипту, а інтерпретатор perl текст, що призначений для cmd.exe, ігноруватиме до "#!perl". Аналогічно для ruby. З python трохи складніше, бо його інтерпретатор проігнорує лише першу строку, тому для cmd.exe перша строка:
@python -x %~f0 %* & goto :eof
А як же *nix? А стандарт треба читати. Якщо у скрипті немає шебангу "#!" то система запустить Єдиний та Неповторний Шел -- True One Shell, тобто /bin/sh. Це те, що нам і треба! Перша строка для python:
exec python -x "$0" ${1+"$@"}; exit # exit, якщо система не знайшла python.
Ну, шо? То як вам хєрня від бородатого гакера?