bash
Командная оболочка Bash (Bourne Again SHell) — интерактивный интерпретатор и язык сценариев
Описание
Bash (Bourne Again SHell) — наиболее распространённая командная оболочка в Linux-системах, разработанная Брайаном Фоксом в 1989 году как свободная замена оболочке Bourne Shell (sh). Bash является стандартной оболочкой во всех дистрибутивах Linux (Debian, Ubuntu, Fedora, Arch) и macOS (до Catalina). Оболочка поддерживает интерактивный режим для пользовательских сессий и неинтерактивный режим для выполнения скриптов.
Bash предоставляет богатый язык сценариев: переменные, массивы, ассоциативные массивы, условные конструкции, циклы, функции, подстановку команд, арифметические вычисления, регулярные выражения и многое другое. Скрипты Bash используются для автоматизации системного администрирования, сборки проектов, деплоя, обработки данных и оркестрации процессов.
Помимо запуска скриптов, bash можно вызывать явно для указания версии оболочки, изменения параметров среды или запуска команды в изолированном окружении. Используй bash когда нужна максимальная совместимость с bash-специфичными возможностями: массивами, [[-тестами, process substitution, mapfile и другими расширениями сверх POSIX.
Синтаксис
- OPTIONS — флаги, управляющие поведением оболочки (см. таблицу ниже)
- SCRIPT — путь к файлу скрипта для выполнения
- ARGUMENTS — позиционные параметры, доступные в скрипте как
$1,$2, … - -c "COMMAND_STRING" — выполнить строку команды без файла скрипта
- -s — читать команды из стандартного ввода (stdin); позиционные параметры задаются аргументами
Флаги и опции
| Флаг | Описание |
|---|---|
-c "cmd" | Выполнить строку cmd как команду, затем завершить. Пример: bash -c "echo hello" |
-s | Читать команды из stdin. Позволяет передавать скрипт по пайпу: echo 'ls' | bash -s |
-x | Debug-режим: печатать каждую команду перед выполнением (trace). Незаменим при отладке скриптов |
-e | Завершить скрипт немедленно, если любая команда вернула ненулевой код завершения (errexit) |
-u | Считать обращение к неустановленной переменной ошибкой (nounset). Защищает от опечаток в именах переменных |
-o pipefail | Возвращать код ошибки пайпа, если хотя бы одна команда в цепочке завершилась с ошибкой |
-n | Читать команды для проверки синтаксиса, но не выполнять их (noexec / dry-run) |
-v | Verbose: печатать каждую строку скрипта по мере её чтения (до расширения переменных) |
-i | Запустить интерактивную оболочку даже если stdin не является терминалом |
-l | Запустить как login shell: загрузить /etc/profile, ~/.bash_profile |
--noprofile | Не загружать системные и пользовательские профильные файлы при старте login shell |
--norc | Не загружать ~/.bashrc при старте интерактивной неlogin-оболочки |
--rcfile FILE | Загрузить FILE вместо стандартного ~/.bashrc |
--version | Вывести версию Bash и завершить |
Паттерны использования
Запуск скрипта с отладкой
# Отладочный запуск скрипта bash -x deploy.sh production # Включить несколько режимов сразу bash -euxo pipefail deploy.sh # Inline-отладка внутри скрипта set -euxo pipefail
Выполнение команды из строки
# Одна команда bash -c "echo \$HOME" # Несколько команд bash -c "cd /tmp && ls -la && pwd" # Передача аргументов в -c bash -c 'echo "Hello, $1!"' _ World
Проверка синтаксиса без запуска
# Проверить скрипт на ошибки синтаксиса bash -n myscript.sh # Ожидаемый вывод при ошибке: # myscript.sh: line 5: syntax error near unexpected token 'fi'
Shebang и заголовок скрипта
#!/usr/bin/env bash # Portable shebang — находит bash в PATH # Строгий режим (рекомендуется всегда) set -euo pipefail IFS=$'\n\t' echo "Script start: $0" echo "Arguments: $@"
Скрипт с позиционными параметрами
#!/usr/bin/env bash
set -euo pipefail
# Проверить наличие аргумента
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <name>" >&2
exit 1
fi
NAME="$1"
echo "Hello, ${NAME}!"
Получить скрипт из сети и выполнить
# Стандартный паттерн установщиков # (использовать только из доверенных источников!) curl -fsSL https://example.com/install.sh | bash # Безопаснее — сначала скачать, проверить, запустить curl -fsSL https://example.com/install.sh -o install.sh bash -n install.sh && bash install.sh
Советы и предупреждения
Начинай каждый скрипт с
set -euo pipefail. Это включает три защитных режима сразу: выход при ошибке (-e), ошибка на неустановленных переменных (-u), и корректный код выхода пайпа (pipefail). Дополни IFS=$'\n\t' для безопасного разбиения строк.
Инструмент
shellcheck статически анализирует bash-скрипты и указывает на распространённые ошибки: непроцитированные переменные, неверные конструкции, устаревший синтаксис. Устанавливается через пакетный менеджер: apt install shellcheck или brew install shellcheck.
Паттерн
curl URL | bash выполняет произвольный код без проверки. Никогда не применяй его для скриптов из ненадёжных источников. Безопасная альтернатива: скачай скрипт, проверь его содержимое, затем запусти. Проверяй хэш-суммы если они опубликованы.
Скрипты с shebang
#!/bin/sh могут выполняться разными оболочками (dash, ash, bash). Bash-специфичные конструкции ([[, массивы, $(( )), local) не являются POSIX и могут сломаться. Если скрипт использует bash-расширения — всегда указывай #!/usr/bin/env bash.