Bash основы

Командная оболочка для взаимодействия с ОС через текстовые команды: навигация, файлы, потоки

Зачем нужно

  • Управлять файлами и процессами быстрее чем через GUI
  • Работать с Git, npm, серверами
  • Автоматизировать рутинные задачи
  • Работать на серверах без графического интерфейса

Где используется

  • Ежедневная разработка (Git, npm, сборка)
  • Системное администрирование
  • CI/CD пайплайны
  • Docker и серверы

Предпосылки

  • Базовое понимание файловой системы

Что такое Shell

Shell (оболочка) — программа-посредник между пользователем и ОС.

Shell Система Описание
Bash Linux, macOS (до Catalina) Самый распространённый
Zsh macOS (с Catalina) Расширенный Bash
PowerShell Windows Объектно-ориентированный
Git Bash Windows Bash-эмулятор для Windows
# Узнать текущий shell
echo $SHELL
# /bin/bash или /bin/zsh

Навигация по файловой системе

pwd — текущая директория

pwd
# /home/user/projects

ls — содержимое директории

# Базовый вывод
ls

# Подробный список
ls -l
# drwxr-xr-x  4 user group 128 Apr  6 10:00 src
# -rw-r--r--  1 user group 256 Apr  6 10:00 index.js

# Показать скрытые файлы
ls -a

# Комбинировать: подробный + скрытые
ls -la

# Человеко-читаемые размеры
ls -lh
# -rw-r--r--  1 user group 2.5K index.js

# Сортировка по времени (новые первые)
ls -lt

# Рекурсивно (все вложенные)
ls -R

cd — переход в директорию

# Перейти в папку
cd projects

# В домашнюю директорию
cd ~
# или просто
cd

# На уровень вверх
cd ..

# Два уровня вверх
cd ../..

# В предыдущую директорию
cd -

# Абсолютный путь
cd /home/user/projects/my-app

Работа с файлами и папками

Создание

# Создать файл (пустой или обновить дату)
touch index.html
touch style.css script.js  # несколько файлов

# Создать папку
mkdir src

# Создать вложенные папки
mkdir -p src/components/ui

# Создать файл с содержимым
echo "Hello World" > hello.txt

# Многострочный контент
cat > config.txt << 'EOF'
host=localhost
port=3000
EOF

Копирование

# Копировать файл
cp index.html backup.html

# Копировать в папку
cp index.html src/

# Копировать папку (рекурсивно)
cp -r src/ src-backup/

Перемещение и переименование

# Переместить файл
mv old-file.js src/

# Переименовать
mv old-name.js new-name.js

# Переместить и переименовать
mv src/temp.js dist/main.js

Удаление

# Удалить файл
rm temp.txt

# Удалить папку (рекурсивно)
rm -r old-folder/

# Удалить принудительно (без подтверждения) — ОСТОРОЖНО!
rm -rf node_modules/

# Удалить пустую папку
rmdir empty-folder/

Просмотр файлов

# Вывести содержимое
cat index.html

# С нумерацией строк
cat -n index.html

# Постраничный просмотр
less index.html
# q — выйти, / — поиск, n — следующее совпадение

# Первые/последние строки
head -20 log.txt      # первые 20 строк
tail -20 log.txt      # последние 20 строк
tail -f log.txt       # следить за файлом в реальном времени

echo — вывод текста

echo "Hello, World!"

# Записать в файл (перезаписать)
echo "новый текст" > file.txt

# Дописать в файл
echo "ещё строка" >> file.txt

# Переменные окружения
echo $HOME
echo $PATH
echo $USER

Pipes и перенаправление

Pipe (|) — передача вывода

# Вывод одной команды → вход другой
ls -la | head -5          # первые 5 строк вывода ls
cat log.txt | wc -l       # количество строк в файле
history | grep "git"      # найти git-команды в истории

Перенаправление

# > — записать в файл (перезаписать)
echo "data" > output.txt

# >> — дописать в файл
echo "more data" >> output.txt

# 2> — перенаправить ошибки
npm build 2> errors.log

# &> — и stdout, и stderr
npm build &> all-output.log

# /dev/null — отбросить вывод
npm install > /dev/null 2>&1

Полезные операторы

# && — следующая команда ТОЛЬКО если предыдущая успешна
mkdir project && cd project && git init

# || — следующая команда ТОЛЬКО если предыдущая провалилась
cd project || echo "Папка не найдена"

# ; — выполнить последовательно (независимо от результата)
echo "start"; npm test; echo "done"

Переменные

# Создать переменную (без пробелов вокруг =)
NAME="Ivan"
PORT=3000

# Использовать
echo "Hello, $NAME"
echo "Server on port $PORT"

# Переменные окружения
export NODE_ENV=production

# Посмотреть все переменные окружения
env

# Подстановка команды
CURRENT_DATE=$(date)
FILE_COUNT=$(ls | wc -l)
echo "Файлов: $FILE_COUNT"

Права доступа (кратко)

# Формат: rwx rwx rwx
#          │   │   └── Остальные (others)
#          │   └────── Группа (group)
#          └────────── Владелец (owner)
# r=read(4), w=write(2), x=execute(1)

ls -l
# -rwxr-xr-- 1 user group 1024 index.js
# rwx = 7 (владелец: всё)
# r-x = 5 (группа: чтение + выполнение)
# r-- = 4 (остальные: только чтение)

# Сделать файл исполняемым
chmod +x script.sh

# Числовой формат
chmod 755 script.sh    # rwxr-xr-x
chmod 644 index.html   # rw-r--r--

Частые ошибки

  • rm -rf / — удалит ВСЮ файловую систему. Никогда не выполняйте от root
  • Пробелы в =NAME = "Ivan" не работает, нужно NAME="Ivan"
  • Забыть кавычкиcd my folder не работает, нужно cd "my folder"
  • > вместо >> — перезапись вместо дописывания
  • Не проверить pwd перед rm -rf — убедитесь что вы в правильной папке

Практика

  1. Создайте структуру проекта командами: mkdir -p, touch
  2. Создайте файл, запишите в него текст, допишите ещё строку
  3. Используйте | для подсчёта файлов в директории
  4. Создайте переменную и используйте её в echo
  5. Попробуйте && для цепочки команд
  6. Используйте cat, head, tail, less для просмотра файлов

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

Ресурсы