Bash vs sh/zsh

Тема дорожной карты · Bash

bash и sh — оба являются интерпретаторами Unix-оболочки, однако sh обозначает POSIX-совместимую оболочку — зачастую dash в Debian/Ubuntu, — тогда как bash — это GNU Bourne Again SHell с расширенными возможностями написания скриптов, включая массивы, условные конструкции [[ ]] и подстановку процессов. Скрипты, начинающиеся с #!/bin/sh, должны использовать только синтаксис POSIX для обеспечения переносимости между Linux, macOS и BSD-системами, тогда как скрипты с #!/bin/bash могут применять Bash-специфичные конструкции, такие как declare -A, local и арифметика (( )). Разница в производительности важна для системных сценариев инициализации — dash запускается значительно быстрее bash, поэтому дистрибутивы на основе Debian используют dash в качестве /bin/sh для автоматизации при загрузке. При написании shell-скриптов для контейнеров, встраиваемого Linux или образов на основе Alpine использование синтаксиса POSIX sh обеспечивает работу автоматизации без установки полноценного окружения Bash. Понимание различий между bash и sh необходимо для написания переносимых и эффективных Linux shell-скриптов, которые ведут себя одинаково в разных командных окружениях.

Как это работает

Bash vs sh/zsh — 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' в начале.

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

Ловушки Bash vs sh/zsh: путаница bash и sh (POSIX sh беднее — dash на Debian дефолтный /bin/sh); не обрабатывают ошибки (дефолт продолжает после сбоев); bash-скрипты с расчётом на GNU coreutils (sed -i "" vs sed -i) ломаются на macOS; алиасы внутри скриптов (фича интерактивного shell).

Связанные понятия

Полезные ресурсы