О шебангах в скриптах 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
(или её аналогом), для того чтобы узнать нахождение нужного интерпретатора.