mirror of
https://github.com/Linux4Yourself/book.git
synced 2025-02-10 05:24:40 +08:00
55 lines
3.8 KiB
Markdown
55 lines
3.8 KiB
Markdown
# О шебангах в скриптах 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` (или её аналогом), для того чтобы узнать нахождение нужного интерпретатора.
|