Тайна первой строки в Linux‑скрипте: что такое #!/usr/bin/env bash и #!/bin/bash?
Когда пишете скрипт в Linux, обычно в самом начале ставят одну из этих строк.
#!/usr/bin/env bash
или
#!/bin/bash
На первый взгляд это выглядит как обычный комментарий… но что же скрывается за этой строкой? И в чём разница между ними? В этой статье разберём смысл, различия и когда какой вариант использовать.
1. Это не комментарий: что такое shebang (шебанг)?
Строка, начинающаяся с #!, называется shebang (шебанг).
#!/bin/bash
Для оболочки она выглядит как комментарий, но для ядра операционной системы это
«Указание, какой интерпретатор должен использоваться для выполнения этого скрипта».
То есть:
#!/bin/bash→ «Запусти этот файл через/bin/bash»#!/usr/bin/env bash→ «Найдиbashчерезenvи запусти файл с ним».
2. Как ядро запускает скрипт?
Процесс можно упростить так:
- Пользователь запускает исполняемый скрипт
bash chmod +x script.sh ./script.sh - Ядро читает
script.sh - Проверяет, начинается ли файл с
#! - Если да, то берёт остальную часть строки как «путь к интерпретатору + аргументы» и запускает
bash /bin/bash script.sh
Важно: перед
#!пробелов не должно быть.
3. Что означает и какие особенности #!/bin/bash?
Самый распространённый вариант.
#!/bin/bash
Смысл
- Скрипт написан для
bashи интерпретатор находится в/bin/bash.
Плюсы
- Ясность: всегда используется
/bin/bash. - Производительность: нет поиска пути через
env. - На большинстве дистрибутивов
/bin/bashсчитается стандартным местом.
Минусы
- Непереносимость: на системах, где
bashнаходится в другом месте, скрипт не запустится. - На macOS, BSD, NixOS и некоторых контейнерах путь может отличаться.
4. Что означает и какие особенности #!/usr/bin/env bash?
Современный, часто используемый вариант.
#!/usr/bin/env bash
Ключевой момент – /usr/bin/env.
envищет программу в переменнойPATH.- Ядро фактически запускает:
bash /usr/bin/env bash script.sh
Плюсы
- Портативность: работает, если
bashнаходится в любом месте, указанном вPATH. - Использование пользовательского
bash: если пользователь переопределилPATH, будет использован егоbash. - Аналогично используется для Python:
#!/usr/bin/env python3.
Минусы
- Требуется
/usr/bin/env: в некоторых изолированных системах может отсутствовать. - Зависимость от
PATH: если вPATHокажется другойbash, может запуститься не тот, который ожидается. - Безопасность: в критичных системах предпочтительнее абсолютный путь.
5. Сравнение
| Параметр | #!/bin/bash |
#!/usr/bin/env bash |
|---|---|---|
| Указание интерпретатора | Абсолютный путь | Поиск в PATH |
| Портативность | Низкая | Высокая |
Выбор bash |
Всегда /bin/bash |
Первый найденный в PATH |
| Гарантия версии | Легко контролировать | Зависит от PATH |
| Безопасность | Более строгая | Менее строгая |
| Тренд | Старый стиль | Современный, рекомендуемый |
6. Когда что использовать?
1) Личные/командные скрипты (разработка)
#!/usr/bin/env bash
- Разные среды (локальная машина, CI, серверы) могут иметь
bashв разных местах. envобеспечивает гибкость.
2) Скрипты для конкретного сервера
Если все серверы используют /bin/bash:
#!/bin/bash
- Гарантирует одинаковый интерпретатор.
- Уменьшает риск непредвиденных изменений.
3) Максимальная портативность
Если возможно отсутствие bash, лучше писать на sh:
#!/bin/sh
- Работает в большинстве Unix‑систем.
- Не использует специфичные для
bashконструкции.
7. Практические советы при использовании #!/usr/bin/env bash
1) Как запускать
chmod +x script.sh
./script.sh
Запуск через bash script.sh игнорирует shebang.
2) Передача аргументов
#!/usr/bin/env bash
echo "Интерпретатор: $0"
echo "Аргументы: $@"
При запуске ./test.sh hello world вывод:
Интерпретатор: ./test.sh
Аргументы: hello world
$0 – путь к скрипту, а ядро фактически выполняет /usr/bin/env bash test.sh hello world.
8. Распространённые заблуждения
«Первая строка – просто комментарий, можно не писать»
- Это правда, если вы явно указываете интерпретатор:
bash myscript.sh. - Но если хотите запускать как
./myscript.sh, shebang обязателен.
«Можно использовать #!/bin/env»
- Некоторые системы имеют
/bin/env, но стандартный путь –/usr/bin/env. - Без особой причины используйте
/usr/bin/env.
9. Итоги
#!/usr/bin/env bashи#!/bin/bash– это не комментарии, а инструкции ядру о том, какой интерпретатор использовать.#!/bin/bashфиксирует/bin/bash– предсказуемо, но менее переносимо.#!/usr/bin/env bashищетbashвPATH– гибко, но зависит от окружения.- В большинстве современных сценариев рекомендуется использовать
#!/usr/bin/env bash.

Комментариев нет.