Перейти к содержанию

О шебангах в скриптах Linux⚓︎

Все скрипты, которые создаёт пользователь, исполняемыми не являются. Для того чтобы дать право исполнения определённому файлу, нужно выполнить:

chmod +x $FILE

Где $FILE - имя файла

Конечно, скрипт можно запустить и без права исполнения, для этого нужно запустить его в определённом интерпретаторе (bash, perl, python, et cetera):

bash $FILE

Или

python $FILE

Но это не очень удобно, да и замедляет пользователя. А как быть, если скрипт нужно поместить, скажем, в /usr/bin или в любом другом каталоге из переменной PATH? Например, пакетный менеджер slackpkg из состава Slackware Linux или urpmi из Mandriva/Rosa/Mageia - те же самые скрипты на Bash и Perl соответственно.

Поэтому, лучшим решением будет вставка определёной строки с указанием нужного интерпретатора. Эта строка называется sha-bang (шебанг). И потом сделать скрипт исполняемым.

Например, для Bash-скриптов шебанг выглядит так:

#!/bin/bash

Или так:

#!/bin/env bash

env - UNIX-утилита, позволяющая модифицировать список переменных окружения перед исполнением пользовательской команды с изменением окружения.

Но также эту команду используют и для улучшения переносимости скриптов, так как в разных дистрибутивах нужные интерпретаторы могут находиться в разных местах, а вот путь к env одинаковый везде.

Например, в одних дистрибутивах путь к bash /bin/bash, а в других: /usr/bin/bash. И при компиляции этого интерпретатора он ставится именно в /usr, а уже позже его можно перенести в /bin (что и реализовано в этом руководстве, поэтому в вашем дистрибутиве путь классический: /bin/bash).

А, например, во FreeBSD bash находится по пути /usr/local/bin/bash, поэтому использование env будет таким:

#!/usr/bin/env bash

Но тут ещё одна загвоздка: иногда различаются ещё и имена интерпретаторов. Например, Python3 в системе Windows (через MinGW, например) называется python, а не python3, как, например, в Linux.

Поэтому, перед созданием скриптов (или при переноса таковых из Linux for yourself в другие системы) будьте внимательны в правильности шебанга. А лучше, проверьте его или тестовым скриптом (самый простейший "Hello, world!"), либо же воспользуйтесь утилитой which (или её аналогом), для того чтобы узнать нахождение нужного интерпретатора.

К началу