# Shell и Bash

> Командная оболочка (shell) — программа, принимающая команды пользователя и запускающая другие программы; Bash — самая распространённая оболочка в Linux.

Источник: https://llmdocs.ru/wiki/shell-bash/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: командная оболочка Unix и язык сценариев
- **Автор Bash**: Брайан Фокс (проект GNU)
- **Первый выпуск Bash**: 1989
- **Сопровождающий**: Чет Рэми (с 1990-х)
- **Предшественник**: Bourne shell (sh, Стивен Борн, 1979)
- **Стандарт**: POSIX Shell Command Language
- **Лицензия**: GNU GPL v3 (с версии 4.0)
- **Альтернативы**: Zsh, fish, dash, ksh
**Командная оболочка** (англ. *shell*, «оболочка», «шелл») — программа, которая читает команды пользователя, запускает соответствующие программы и показывает результат. Это главный текстовый интерфейс [Linux](https://llmdocs.ru/wiki/linux.md) и других Unix-подобных систем. Оболочка одновременно служит и интерактивной средой, и языком программирования: последовательность команд можно сохранить в файл-**скрипт** и запускать как программу.

**Bash** (*Bourne Again Shell* — игра слов: «снова Борн» и «рождённый заново») — самая распространённая оболочка Linux, стандартная во многих дистрибутивах и в образах [Docker](https://llmdocs.ru/wiki/docker.md). Под словом «шелл-скрипт» обычно понимают скрипт на Bash или на совместимом с POSIX `sh`.

## История

Первая оболочка Unix (Thompson shell, 1971) умела только запускать команды и перенаправлять ввод-вывод. В 1979 году в Unix Version 7 появилась **Bourne shell** (`sh`) Стивена Борна — уже с переменными, условиями и циклами. Затем возникли C shell (csh), KornShell (ksh), а в 1989 году Брайан Фокс написал для проекта GNU свободную замену `sh` — Bash.[2] Вскоре сопровождение перешло к Чету Рэми, который ведёт проект до сих пор.

Язык оболочки стандартизирован в POSIX: скрипт, использующий только возможности POSIX `sh`, переносим между Bash, dash, ksh и [Zsh](https://llmdocs.ru/wiki/zsh.md).[3] В Debian и Ubuntu `/bin/sh` — это минималистичная оболочка dash, а Bash используется для интерактивной работы. Apple в macOS Catalina (2019) сменила оболочку по умолчанию на Zsh, оставив в системе старую Bash 3.2 — последнюю версию под GPL v2.[5]

## Как оболочка выполняет команду

Прежде чем запустить программу, оболочка разбирает строку в несколько этапов: разбивает её на слова, раскрывает фигурные скобки (`{a,b}`), тильду (`~`), переменные (`$HOME`), подстановку команд (`$(date)`), арифметику (`$((1+2))`), затем снова делит результат на слова по пробелам и раскрывает шаблоны имён файлов (`*.txt`). Только после этого ищется программа в каталогах из [переменной](https://llmdocs.ru/wiki/environment-variables.md) `PATH` и запускается через системные вызовы `fork` и `exec`.[1]

Отсюда главное правило: **заключайте переменные в двойные кавычки**. `rm $file` при имени файла с пробелом удалит два разных файла, а `rm "$file"` — ровно один.

## Основы синтаксиса

```bash
#!/usr/bin/env bash
set -euo pipefail                 # падать на ошибках и неопределённых переменных

name="мир"                        # без пробелов вокруг =
echo "Привет, $name"

files=(*.log)                     # массив (возможность Bash, не POSIX)
echo "логов: ${#files[@]}"

if [[ -d /var/log ]]; then        # [[ ]] — расширенная проверка Bash
    echo "каталог есть"
fi

for f in "${files[@]}"; do
    gzip -- "$f"
done

count=$(grep -c ERROR app.log || true)   # подстановка вывода команды
(( count > 0 )) && echo "ошибок: $count"

backup() {                         # функция
    local src=$1
    tar czf "/tmp/$(basename "$src").tgz" "$src"
}
backup /etc/nginx
```

Каждая команда возвращает **код выхода**: 0 — успех, любое другое число — ошибка. На кодах выхода построены `if`, операторы `&&` и `||`. Строка `set -euo pipefail` заставляет скрипт останавливаться при первой ошибке, при обращении к неопределённой переменной и при сбое любой команды в [конвейере](https://llmdocs.ru/wiki/pipes-redirection.md).

## Перенаправление и конвейеры

| Запись | Смысл |
|---|---|
| `cmd > file` | вывод в файл (перезаписать) |
| `cmd >> file` | дописать в конец файла |
| `cmd 2> err.log` | поток ошибок в файл |
| `cmd > out.log 2>&1` | оба потока в один файл |
| `cmd < file` | ввод из файла |
| `a \| b` | вывод `a` на вход `b` |

Конвейеры — суть философии Unix: маленькие программы, каждая делает одно дело, соединяются в цепочку. Например, десять самых частых IP-адресов в логе: `cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head`. Для поиска по тексту используют [grep](https://llmdocs.ru/wiki/grep.md), для преобразования — [sed и awk](https://llmdocs.ru/wiki/sed-awk.md), для обхода файлов — [find и xargs](https://llmdocs.ru/wiki/find-xargs.md).

## Интерактивная работа

Bash хранит историю команд (`Ctrl+R` — поиск по ней), дополняет имена по `Tab`, поддерживает горячие клавиши в стиле Emacs (`Ctrl+A`/`Ctrl+E` — начало и конец строки). Настройки и псевдонимы (`alias ll='ls -la'`) хранятся в `~/.bashrc`. Справку по встроенным командам даёт `help`, по остальным — [man-страницы](https://llmdocs.ru/wiki/man-pages.md) и краткие примеры [tldr-pages](https://llmdocs.ru/wiki/tldr-pages.md).

## Когда не писать на Bash

Bash хорош для склейки программ, автоматизации развёртывания и коротких сценариев. Когда скрипт перерастает сотню строк, требует сложных структур данных, разбора JSON (хотя есть [jq](https://llmdocs.ru/wiki/json.md)) или обработки ошибок, его лучше переписать на [Python](https://llmdocs.ru/wiki/python.md). Для проверки скриптов незаменим статический анализатор ShellCheck: он находит пропущенные кавычки, непереносимые конструкции и типичные ловушки.[4]

## См. также

- [Zsh](https://llmdocs.ru/wiki/zsh.md)
- [Конвейеры и перенаправление (pipes)](https://llmdocs.ru/wiki/pipes-redirection.md)
- [Переменные окружения](https://llmdocs.ru/wiki/environment-variables.md)
- [grep и регулярные выражения](https://llmdocs.ru/wiki/grep.md)
- [Linux](https://llmdocs.ru/wiki/linux.md)

## Источники

1. [GNU Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html)
2. [Bash — домашняя страница Чета Рэми](https://tiswww.case.edu/php/chet/bash/bashtop.html)
3. [POSIX.1-2024 — Shell Command Language](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html)
4. [ShellCheck — статический анализатор shell-скриптов](https://www.shellcheck.net/)
5. [Apple — Use zsh as the default shell on your Mac](https://support.apple.com/en-us/102360)
