linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/shebang

kb/processes ── Процессы и ресурсы ── beginner

Shebang: первая строка скрипта

Первая строка скрипта вида `#!/usr/bin/env bash` говорит ядру какой интерпретатор поднимать. Без shebang скрипт запускается через текущий shell - и в bash-режиме на проде ломается на /bin/sh.

view as markdownaka: hashbang, interpreter-line

Что это

Когда ядро видит запрос на исполнение файла с битом +x, оно читает первые два байта. Если это #! - называется shebang (или hashbang) - следующая часть строки трактуется как путь к интерпретатору.

bash
#!/usr/bin/env bash
echo hello

При вызове ./script.sh ядро видит #! → запускает /usr/bin/env bash ./script.sh → env находит bash в $PATH → bash интерпретирует скрипт.

Без #!, поведение зависит от того кто запускает:

  • Из bash-шелла - bash сам выполнит как bash-скрипт
  • Из dash/zsh/fish - может выполниться по правилам этого шелла
  • Через exec() без shell - ядро откажет с ENOEXEC

Поэтому всегда пиши shebang.

/bin/bash vs /usr/bin/env bash

Два варианта которые часто встречаются:

bash
#!/bin/bash             # хардкод пути
#!/usr/bin/env bash     # ищем bash через PATH

Лучше второй. Причины:

Сценарий/bin/bash/usr/bin/env bash
macOS - bash 5 через brew в /usr/local/bin/bashустаревший 3.xсвежий 5.x
Alpine Linux - bash в /usr/bin/bash или вообще нетне работаетработает если установлен
NixOS - bash в /nix/store/.../bin/bashне работаетработает
Стандартный Debian/Ubuntuработаетработает

Исключение - #!/bin/sh. POSIX гарантирует что POSIX-shell всегда лежит в /bin/sh. Если скрипт реально POSIX-совместим - пиши /bin/sh и не страдай.

Аргументы интерпретатору

В shebang можно передать один аргумент (Linux ограничение):

bash
#!/usr/bin/env -S bash -euo pipefail

▸-S разбивает строку на токены (без -S весь "bash -euo pipefail" уйдёт как ОДИН аргумент)

Через env -S (требует coreutils 8.30+) можно вкорячить strict-mode прямо в shebang. Альтернатива - set -euo pipefail первой строкой скрипта.

Не только bash

Shebang работает с любым интерпретатором:

python
#!/usr/bin/env python3
print("hello from python")
ruby
#!/usr/bin/env ruby
puts "hi"
nodejs
#!/usr/bin/env node
console.log('hi')

Идиома /usr/bin/env <interpreter> универсальна - работает для всех.

Типичные ошибки

  • CRLF (Windows line endings) - ядро видит #!/usr/bin/env bash\r и пытается найти интерпретатор bash\r. Ошибка bad interpreter: No such file or directory. Решение: dos2unix file.sh.
  • Нет бита +x - chmod +x file.sh.
  • Не указан полный путь - #!bash не сработает, нужен абсолютный путь.
  • Shebang не на ПЕРВОЙ строке - ядро смотрит только на первые два байта, пустая строка перед shebang ломает магию.

§ команды

bash
head -1 script.sh

Посмотреть shebang существующего скрипта

bash
file script.sh

Покажет тип файла и какой интерпретатор по shebang'у - полезно для бинарей

bash
chmod +x script.sh && ./script.sh

Сделать исполнимым и запустить - стандартный пайплайн

bash
dos2unix script.sh

Убрать Windows CRLF если файл прилетел из Windows-редактора

§ см. также

  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • file-permissionsFile permissions: rwx и chmodКаждый файл имеет три набора прав - для владельца, группы и остальных. Каждый набор это три бита: read (r), write (w), execute (x). Меняем через `chmod`.
  • fhsFilesystem Hierarchy Standard (FHS)FHS - стандарт что лежит в каких корневых каталогах Linux: /etc - конфиги, /var - изменяемые данные, /usr - статика дистрибутива, /home - пользователи, /tmp - временное.
  • bash-strict-modeBash strict mode: set -euo pipefailТри флага в начале bash-скрипта которые превращают его из «прощающего всё» в «упасть на первой же ошибке». Без них баги молча копятся.

§ упоминается в уроках

  • ›beginner-12-shell-scripting
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки