Linux & Administration

Bash

Bourne Again Shell — командная оболочка и язык сценариев, стандартная точка входа на большинстве Linux-серверов.

Что такое Bash

Bash (Bourne Again Shell) — командная оболочка Unix-систем и одновременно язык сценариев. Это программа, которая принимает набранные вами строки, разбирает их, запускает нужные утилиты и показывает результат. Именно её вы видите, подключившись к серверу по SSH.

Имя — каламбур: Bash написан для проекта GNU как замена старой оболочки Bourne shell (sh), отсюда «рождённый заново». Он остаётся оболочкой по умолчанию в Debian, Ubuntu и RHEL; в macOS по умолчанию с некоторых пор стоит zsh, но Bash там тоже есть.

Что означает #!/bin/bash

Эта строка называется shebang (шебанг) и обязана быть первой строкой файла. Она говорит ядру, какой программой выполнять этот файл.

#!/bin/bash
echo "Скрипт выполняется интерпретатором Bash"

Без шебанга файл — просто текст, и результат зависит от того, кто его запустил. С шебангом достаточно сделать файл исполняемым, и он запускается как обычная команда:

chmod +x deploy.sh
./deploy.sh

Частая путаница: #!/bin/bash и #!/bin/sh — не одно и то же. /bin/sh в Debian и Ubuntu указывает на dash — минимальную оболочку без массивов, [[ ]] и подстановок Bash, поэтому скрипт с #!/bin/sh упадёт на bash-специфичном синтаксисе. Вариант #!/usr/bin/env bash берёт первый bash из PATH — надёжнее на macOS и BSD, где Bash лежит в другом месте.

Скрипт, который не выстрелит в ногу

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/db"
STAMP=$(date +%F_%H-%M)

mkdir -p "$BACKUP_DIR"
pg_dump -U app mydb | gzip > "$BACKUP_DIR/mydb_$STAMP.sql.gz"
find "$BACKUP_DIR" -name '*.sql.gz' -mtime +7 -delete   # чистка старше 7 дней

echo "Бэкап готов: $BACKUP_DIR/mydb_$STAMP.sql.gz"

set -euo pipefail — три строчки, которые стоит писать в каждом скрипте:

  • -e — прервать выполнение при первой же ошибке, а не бодро идти дальше
  • -u — падать при обращении к необъявленной переменной (спасает от rm -rf "$DIR/" с пустым DIR)
  • -o pipefail — считать конвейер упавшим, если упало любое его звено, а не только последнее

Кавычки вокруг "$BACKUP_DIR" — не украшение: без них путь с пробелом развалится на два аргумента.

Конвейеры и перенаправления

Философия Unix: маленькие утилиты, соединённые в цепочку. Вывод одной идёт на вход следующей.

# Топ-10 IP по числу запросов в логе nginx
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Ошибки за сегодня — в файл
journalctl -u myapp --since today | grep -i error > /tmp/errors.txt
Оператор Что делает
| вывод команды слева на вход команде справа
> перенаправить вывод в файл (перезаписать)
>> дописать в конец файла
2> перенаправить поток ошибок
&& выполнить следующую команду, только если предыдущая успешна
|| выполнить, только если предыдущая упала

Где Bash встречается ежедневно

Он не только в терминале: строки RUN в Dockerfile, шаги CI/CD-пайплайнов, ExecStart в юнитах systemd, задачи по расписанию — всё это команды Bash. Один и тот же навык окупается везде.

Связанные термины

  • CLI — интерфейс, оболочкой которого служит Bash
  • Linux — среда обитания Bash
  • Утилиты Linux — то, что вызывают из скриптов
  • grep — постоянный участник конвейеров
  • SSH — как попасть в Bash на сервере
  • PowerShell — аналог из мира Windows

Готовы запустить GPU-задачу?

Запустить GPU-сервер