bash — что это и зачем
bash (Bourne Again SHell) — это командная оболочка, которая обрабатывает то, что вы вводите в терминале Linux. Запускает программы, расширяет переменные, выполняет конструкции `if` / `for`, читает скрипты из файлов с шебангом `#!/bin/bash`. На Ubuntu — оболочка по умолчанию для интерактивных пользователей; для системных скриптов используют более строгий `/bin/sh` (`dash`).
bash
bash (Bourne Again SHell) — это командная оболочка, которая обрабатывает то, что вы вводите в терминале Linux. Запускает программы, расширяет переменные, выполняет конструкции if / for, читает скрипты из файлов с шебангом #!/bin/bash. На Ubuntu — оболочка по умолчанию для интерактивных пользователей; для системных скриптов используют более строгий /bin/sh (dash).
Что такое shell в принципе
Когда вы открываете терминал и видите приглашение user@host:~$, это пишет shell — программа-оболочка. Её работа: считать строку, разобрать на команду + аргументы, найти исполняемый файл, запустить, вывести результат, ждать следующую строку. Без shell терминал был бы просто чёрным окном.
Shell умеет больше, чем просто вызывать программы:
- Раскрывает переменные —
echo $HOMEподставляется на/home/user. - Глоббинг —
*.txtпревращается в список файлов. - Пайпы —
cmd1 | cmd2соединяет вывод одной программы с входом другой. - Перенаправления —
> fileпишет в файл,2>&1сливает stderr с stdout. - Управляющие конструкции —
if,for,while,case. Это уже превращает shell в полноценный скриптовый язык.
bash — конкретная реализация POSIX shell от GNU, по умолчанию идущая с Linux-дистрибутивами на базе Debian (Ubuntu, Mint), Fedora, RHEL.
bash vs sh vs dash vs zsh
В Linux несколько разных оболочек, и важно понимать, где какая:
sh— это историческое имя. На Ubuntu/bin/sh— это симлинк на/bin/dash, минимальную POSIX-совместимую оболочку. На macOS/bin/sh— этоbashв режиме совместимости. На FreeBSD — отдельная реализация. Когда вы пишете#!/bin/sh, скрипт должен быть POSIX-совместимым (без массивов,[[ ]],<<<).bash(/bin/bash) — расширенная оболочка с массивами, ассоциативными массивами, регулярками[[ … =~ … ]], process substitution<(cmd). Стандарт для интерактивной работы.dash(/bin/dash) — минимальная POSIX shell, которую Ubuntu использует для системных скриптов в/etc/init.d/и/etc/cron.daily/. Работает быстрее bash, но без bash-измов.zsh— альтернативная оболочка с богатой автодополнением, темами (Oh My Zsh), плагинами. Стандартный shell на macOS с 10.15. На Linux ставится черезapt install zsh.fish— дружелюбная shell с подсветкой синтаксиса прямо в командной строке. Не POSIX-совместима, скрипты для bash не запустятся.
Если коротко: в терминале — что удобнее (bash или zsh/fish); в скриптах для прода — #!/bin/bash, если используете bash-измы; #!/bin/sh, если хотите портабельности на любую POSIX-систему.
Что bash умеет в скриптах
Минимальный скелет bash-скрипта:
#!/bin/bash
set -euo pipefail
name="${1:-world}"
echo "Hello, $name"
Что здесь происходит:
#!/bin/bash— шебанг, говорит ядру запускать файл через/bin/bash.set -e— выйти при первой ошибке (ненулевой код возврата команды).set -u— ошибка при использовании необъявленной переменной.set -o pipefail— ошибка в любом шаге пайпа считается ошибкой всего пайпа.${1:-world}— первый аргумент скрипта, илиworldесли не передан.
bash умеет массивы, ассоциативные массивы (declare -A), условия if/else, циклы for/while/until, функции, ловушки на сигналы (trap), арифметику ($(( … ))). Этого достаточно для DevOps-автоматизации, но для бизнес-логики в проде обычно берут Python или Go — в bash сложно безопасно работать с пробелами в путях, JSON, юникодом.
Где встречается bash, кроме терминала
- Скрипты в
/etc/profile.d/— выполняются при логине, настраивают переменные окружения. ~/.bashrc— конфиг интерактивной bash-сессии: алиасы, подсказкаPS1, подключениеbash-completion.pre-commitиpost-mergegit-хуки — обычно тоже на bash.- Dockerfile-инструкция
RUN— каждаяRUNзапускает/bin/sh -c "…". Если нужен bash, явно —RUN bash -c "…"илиSHELL ["/bin/bash", "-c"]. - CI/CD пайплайны — GitHub Actions и GitLab CI по умолчанию запускают
bash -e -o pipefailна runner-ах с Linux. - systemd-юниты —
ExecStart=поддерживает шебанг-скрипты, хотя для длинных конвейеров принято писать отдельные.sh-файлы.
То есть bash живёт почти везде, где есть Linux-сервер. Знание bash — это не про «писать большие приложения», а про «склеивать существующие утилиты в полезные пайплайны».
Версии bash и где они различаются
Текущая мейнстрим-версия — bash 5.x (5.0 вышла в 2019, 5.2 в 2022). На Ubuntu 24.04 LTS — bash 5.2. Что важно знать про версии:
- bash 4.0+ — добавлены ассоциативные массивы (
declare -A),mapfile,${var^^}для верхнего регистра. - bash 5.0+ —
wait -n,EPOCHREALTIME, исправления в parser-е. - bash 3.2 — версия на macOS до сих пор (Apple зафиксировал её из-за GPLv3-лицензии bash 4+). Если пишете скрипт, который должен работать на маках без
brew install bash, держитесь синтаксиса 3.2.
В bash-скриптах для CI и dotfiles стоит проверять версию через ${BASH_VERSION%%.*} и предупреждать пользователя, если она ниже нужной.
Частые вопросы
Чем bash отличается от Linux
bash — это всего лишь оболочка, программа /bin/bash. Linux — это ядро + вся ОС вокруг. Терминал, в котором вы видите приглашение, — это работающая копия bash. Если её снести (apt remove bash, что в Ubuntu невозможно — пакет защищён), терминал останется, но не сможет ничего выполнить, пока вы не зальёте альтернативу.
Что такое bash.org
bash.org — старый сайт с базой смешных цитат из IRC, не имеет отношения к самой оболочке. Часто люди ищут «bash org» именно туда. Сайт de facto мёртв с 2017 года. К утилите /bin/bash он отношения не имел никогда.
Где документация по bash
Лучшие источники: man bash (длинная и подробная), info bash (с примерами), официальный мануал на gnu.org/software/bash, и Bash Reference Manual в виде PDF. Для учёбы — книга «Learning the bash Shell» от O'Reilly.
Как узнать версию bash
bash --version
# или
echo $BASH_VERSION
Что писать в шебанге — #!/bin/bash или #!/usr/bin/env bash
#!/bin/bash — короче, гарантированно работает на Linux (там /bin/bash есть всегда). #!/usr/bin/env bash — портабельнее, ищет bash через $PATH, что важно на macOS, где «современный» bash живёт в /usr/local/bin/bash или /opt/homebrew/bin/bash. Для прод-серверов на Ubuntu разницы нет — пишите как короче.
Что почитать
- bash-массивы — индексные и ассоциативные — как объявлять, обращаться, итерировать массивы и где у них границы.
- if-else в bash — условия, тесты, [] vs — практика проверок: файл, переменная, число, шаблон.
- systemd — где bash-скрипты можно (и нужно) запускать как сервисы.
- grep, find, sed — три утилиты, которые в bash-скриптах встречаются почти всегда.