Тайна первой строки в 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. Как ядро запускает скрипт?

Процесс можно упростить так:

  1. Пользователь запускает исполняемый скрипт bash chmod +x script.sh ./script.sh
  2. Ядро читает script.sh
  3. Проверяет, начинается ли файл с #!
  4. Если да, то берёт остальную часть строки как «путь к интерпретатору + аргументы» и запускает 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

Плюсы

  1. Портативность: работает, если bash находится в любом месте, указанном в PATH.
  2. Использование пользовательского bash: если пользователь переопределил PATH, будет использован его bash.
  3. Аналогично используется для Python: #!/usr/bin/env python3.

Минусы

  1. Требуется /usr/bin/env: в некоторых изолированных системах может отсутствовать.
  2. Зависимость от PATH: если в PATH окажется другой bash, может запуститься не тот, который ожидается.
  3. Безопасность: в критичных системах предпочтительнее абсолютный путь.

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.

image of shebang in linux script