Shebang и запуск скрипта

Превращаем набор команд в файл-скрипт, который можно запускать как программу.

Shebang — это первая строка скрипта вида #!/usr/bin/env bash, которая говорит системе, какой программой исполнять файл.

Скрипт — это просто файл с командами

Если вы выполняете одни и те же команды по очереди, их можно сложить в текстовый файл — это и есть скрипт. Создадим hello.sh:

#!/usr/bin/env bash
echo "Привет из скрипта!"
date

Первая строка — shebang. Дальше обычные команды, по одной на строку. Расширение .sh не обязательно, но помогает понять, что это shell-скрипт.

Почему именно #!/usr/bin/env bash

Символы #! в начале файла — это сигнал ядру: «дальше идёт путь к интерпретатору». Можно написать #!/bin/bash, но Bash не всегда лежит в /bin (например, на некоторых системах он в /usr/local/bin). Конструкция #!/usr/bin/env bash просит env найти Bash по PATH — это переносимее.

Три способа запустить скрипт

Способ первый — передать файл явно интерпретатору. Права на запуск не нужны:

bash hello.sh

Способ второй — сделать файл исполняемым и запустить напрямую. Тут как раз и срабатывает shebang:

chmod +x hello.sh
./hello.sh

Вывод:

Привет из скрипта!
Пн 22 июн 2026 14:03:11 MSK

Способ третий — source hello.sh (или . hello.sh) — выполняет команды в текущей оболочке, а не в новом процессе. Это нужно, когда скрипт меняет переменные окружения, которые должны остаться после его завершения.

Зачем ./ перед именем

Если просто написать hello.sh, Bash будет искать программу в PATH и не найдёт её в текущей папке (по соображениям безопасности текущая папка в PATH не входит). Префикс ./ явно говорит: «файл здесь, рядом».

Как работает под капотом

Когда вы запускаете ./hello.sh, ядро открывает файл, видит #!, читает путь к интерпретатору и фактически выполняет /usr/bin/env bash ./hello.sh. То есть shebang — это инструкция не для Bash, а для ядра операционной системы. Поэтому он обязан быть в самой первой строке, без пробела перед #!.

Файл: hello.sh
┌─────────────────────────┐
│ #!/usr/bin/env bash     │ ◀── строка 1: кем исполнять
│ echo "Привет"           │
│ date                    │
└─────────────────────────┘
        │  ./hello.sh
        ▼
   Ядро читает #! ──▶ запускает bash hello.sh

Частые ошибки

  • Забыли chmod +x. При запуске ./hello.sh получите Permission denied. Либо дайте права, либо запускайте через bash hello.sh.
  • Пробел или пустая строка перед shebang. Тогда #! уже не в первой позиции и не сработает.
  • Перенос строк Windows (CRLF). Невидимый символ \r в конце shebang ломает запуск с ошибкой bad interpreter. Лечится переводом файла в формат Unix (LF).

Итог

  • Скрипт — текстовый файл с командами, первая строка — shebang.
  • #!/usr/bin/env bash переносимее, чем жёсткий #!/bin/bash.
  • Запуск: bash file.sh, или chmod +x плюс ./file.sh, или source file.sh в текущей оболочке.
Проверьте себя
1. Зачем нужна строка #!/usr/bin/env bash в начале скрипта?
AЭто комментарий для людей
BОна сообщает системе, какой программой исполнять файл
CОна импортирует библиотеку bash
DОна задаёт имя скрипта
2. Что делает команда chmod +x hello.sh?
AЗапускает скрипт
BДелает файл исполняемым
CУдаляет права на чтение
DПереименовывает файл
3. Чем source script.sh отличается от ./script.sh?
AНичем
Bsource выполняет команды в текущей оболочке, а не в новом процессе
Csource быстрее
Dsource не требует shebang, а ./ требует