Shebang (#!)
Тема дорожной карты · Bash
Шебанг — последовательность символов #! в самой первой строке скрипта — сообщает ядру Linux, какой интерпретатор использовать при запуске скрипта как самостоятельного файла. Скрипт Bash должен начинаться с #!/usr/bin/env bash, а не с жёстко заданного пути #!/bin/bash, поскольку env ищет bash в $PATH и делает шебанг переносимым между дистрибутивами Linux, macOS и другими Unix-подобными системами, где Bash может быть установлен в нестандартном месте. Для POSIX-переносимых shell-скриптов, которые должны работать в любой оболочке, #!/bin/sh является стандартным шебангом — его использование подразумевает отказ от Bash-специфичных расширений, что является важной практикой при написании кросс-платформенных скриптов автоматизации Linux. Шебанг интерпретируется только при прямом запуске файла (например, ./script.sh); когда скрипт передаётся в качестве аргумента bash script.sh, шебанг игнорируется. Выбор правильного шебанга — это первое решение при написании любого shell-скрипта, которое непосредственно влияет на переносимость, производительность и корректность.
Как это работает
Shebang (#!) — Bourne-Again SHell, дефолтный login shell на большинстве Linux-дистрибутивов. Это и интерактивный интерпретатор, и скриптовый язык. Скрипты начинаются с #!/usr/bin/env bash (или #!/bin/bash для явного пути). Shell парсит ввод в токены, делает расширения (параметры, command substitution, glob), исполняет команды, ловит exit-коды. Современные альтернативы (zsh, fish) хороши интерактивно, но bash остаётся lingua franca для скриптов.
Когда применять
Bash — для shell-автоматизации, которая должна работать на любом Linux/macOS-боксе (zsh+ не гарантирован). #!/usr/bin/env bash лучше #!/bin/sh, когда нужны bash-фичи (массивы, [[ ]], process substitution). Переходите на Python/Go, когда скрипт >~200 строк, нужны структурированные данные или надёжная обработка ошибок. Всегда set -euo pipefail + IFS=$'\n\t' в начале.
Типичные ошибки
Ловушки Shebang (#!): путаница bash и sh (POSIX sh беднее — dash на Debian дефолтный /bin/sh); не обрабатывают ошибки (дефолт продолжает после сбоев); bash-скрипты с расчётом на GNU coreutils (sed -i "" vs sed -i) ломаются на macOS; алиасы внутри скриптов (фича интерактивного shell).
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…