Lx4U-book/docs/additional/sha-bang.md

55 lines
3.8 KiB
Markdown
Raw Normal View History

2021-05-24 23:49:44 +08:00
# О шебангах в скриптах Linux
Все скрипты, которые создаёт пользователь, исполняемыми не являются. Для того чтобы дать право исполнения определённому файлу, нужно выполнить:
2021-05-24 23:49:44 +08:00
```bash
chmod +x $FILE
```
Где `$FILE` - имя файла
Конечно, скрипт можно запустить и без права исполнения, для этого нужно запустить его в определённом интерпретаторе (bash, perl, python, et cetera):
2021-05-24 23:49:44 +08:00
```bash
bash $FILE
```
Или
2021-05-24 23:49:44 +08:00
```python
python $FILE
```
Но это не очень удобно, да и замедляет пользователя. А как быть, если скрипт нужно поместить, скажем, в `/usr/bin` или в любом другом каталоге из переменной `PATH`? Например, пакетный менеджер `slackpkg` из состава Slackware Linux или `urpmi` из Mandriva/Rosa/Mageia - те же самые скрипты на Bash и Perl соответственно.
Поэтому, лучшим решением будет вставка определёной строки с указанием нужного интерпретатора. Эта строка называется _sha-bang_ (_шебанг_). И потом сделать скрипт исполняемым.
2021-05-24 23:49:44 +08:00
Например, для Bash-скриптов шебанг выглядит так:
2021-05-24 23:49:44 +08:00
```bash
#!/bin/bash
```
Или так:
2021-05-24 23:49:44 +08:00
```bash
#!/bin/env bash
```
`env` - UNIX-утилита, позволяющая модифицировать список переменных окружения перед исполнением пользовательской команды с изменением окружения.
Но также эту команду используют и для улучшения переносимости скриптов, так как в разных дистрибутивах нужные интерпретаторы могут находиться в разных местах, а вот путь к `env` одинаковый везде.
2021-05-24 23:49:44 +08:00
2021-06-16 23:39:44 +08:00
Например, в одних дистрибутивах путь к bash `/bin/bash`, а в других: `/usr/bin/bash`. И при компиляции этого интерпретатора он ставится именно в `/usr`, а уже позже его можно перенести в `/bin` (что и реализовано в этом руководстве, поэтому в вашем дистрибутиве путь классический: `/bin/bash`).
2021-05-24 23:49:44 +08:00
А, например, во FreeBSD `bash` находится по пути `/usr/local/bin/bash`, поэтому использование `env` будет таким:
2021-05-24 23:49:44 +08:00
```bash
#!/usr/bin/env bash
```
Но тут ещё одна загвоздка: иногда различаются ещё и имена интерпретаторов.
Например, Python3 в системе Windows (через MinGW, например) называется `python`, а не `python3`, как, например, в Linux.
Поэтому, перед созданием скриптов (или при переноса таковых из Linux for yourself в другие системы) будьте внимательны в правильности шебанга. А лучше, проверьте его или тестовым скриптом (самый простейший "Hello, world!"), либо же воспользуйтесь утилитой `which` (или её аналогом), для того чтобы узнать нахождение нужного интерпретатора.