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

55 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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