Если имя файла с установленными битами разрешения на выполнение введено в командной строке или если имя такого файла передано одному из вызовов вариантов exec*() библиотеки времени выполнения C, ядро Linux попытается загрузить и выполнить его.
Первое, что делает ядро Linux, — читает первые несколько байтов файла в поисках известных «магических» последовательностей. Одна из этих магических последовательностей также может быть интерпретирована как строка ASCII "#!" также известный как «hash bang» и сокращенно «shebang». Когда загрузчик увидит это, он интерпретирует оставшуюся часть строки как имя другого файла для exec, передав первый файл в качестве аргумента. Другим магическим значением является "\x7fELF", который представляет собой классический двоичный исполняемый файл, такой как, скажем, сам /bin/sh. Обратите внимание, что по умолчанию для загрузчика ядра, если в файле нет узнаваемой магии, используется exec /bin/sh и передача ему имени файла в качестве первого аргумента - эквивалент наличия шебанга "#!/bin / ш".
По сути, пометка сценария как исполняемого с помощью chmod +x ./do_one_thing.sh
вместе с шебангом "#!/bin/sh" эквивалентно ш ./do_one_thing.sh
. «Расширение файла» или другие концепции DOS действительно не имеют значения за пределами DOS, ее предков, таких как CP / M, и ее потомков, таких как Microsoft Windows.
Если вам нужен лучший уровень защиты от дурака, пометьте файлы как исполняемые и используйте соответствующий шебанг. Не полагайтесь на людей, чтобы они поступали правильно.