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

49 lines
3.8 KiB
Markdown
Raw Normal View History

2021-05-24 23:49:44 +08:00
# О шебангах в скриптах 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` (или её аналогом), для того, чтобы узнать нахождение нужного интерпретатора.