Командная строка (терминал, bash, shell) — текстовый интерфейс для взаимодействия с операционной системой. Для QA-инженера владение терминалом необходимо для запуска тестов, работы с Git, управления серверами, анализа логов и автоматизации рутинных задач.
1. Зачем тестировщику терминал
Задача
Пример
Запуск автотестов
pytest tests/login_test.py
Работа с Git
git status, git push
Анализ логов
grep "ERROR" app.log
Навигация по файловой системе
cd /var/log/
Управление серверами
SSH, перезапуск сервисов
Работа с Docker
docker run, docker-compose up
Автоматизация
Скрипты для рутины
API-тестирование
curl https://api.example.com/users
2. Навигация по файловой системе
pwd — текущая директория
pwd
# /home/ivan/projects/myapp
cd — смена директории
cd /home/ivan/projects # Перейти по абсолютному пути
cd projects # Перейти по относительному пути
cd .. # На уровень вверх
cd ../.. # На два уровня вверх
cd ~ # В домашнюю директорию
cd - # Вернуться в предыдущую директорию
cd # В домашнюю директорию (то же, что cd ~)
ls — список файлов и папок
ls # Простой список
ls -la # Подробный список (включая скрытые файлы)
ls -lh # С размерами в читаемом формате (KB, MB)
ls -lt # Сортировка по дате изменения
ls -ltr # Сортировка по дате (обратная, новые внизу)
ls *.log # Только файлы .log
ls -R # Рекурсивно (все подпапки)
Пример вывода ls -la:
drwxr-xr-x 5 ivan ivan 4096 Jun 15 10:30 .
drwxr-xr-x 3 ivan ivan 4096 Jun 10 08:00 ..
-rw-r--r-- 1 ivan ivan 2048 Jun 15 10:30 config.yaml
-rwxr-xr-x 1 ivan ivan 512 Jun 14 09:15 run_tests.sh
Часть
Значение
-rw-r--r--
Права: тип + владелец + группа + остальные
1
Количество ссылок
ivan
Владелец
ivan
Группа
2048
Размер в байтах
Jun 15 10:30
Дата изменения
config.yaml
Имя файла
3. Просмотр содержимого файлов
cat — вывод всего файла
cat config.yaml # Вывести содержимое
cat file1.txt file2.txt # Несколько файлов подряд
cat -n config.yaml # С номерами строк
less / more — постраничный просмотр
less huge_log.log # Постраничный просмотр
# Навигация: Space — вниз, b — вверх, q — выход, /pattern — поиск
head / tail — начало и конец файла
head -20 file.txt # Первые 20 строк
tail -20 file.txt # Последние 20 строк
tail -f app.log # Следить за файлом в реальном времени (Ctrl+C для выхода)
tail -f app.log | grep ERROR # Следить только за ошибками
wc — подсчёт строк/слов/символов
wc -l file.txt # Количество строк
wc -w file.txt # Количество слов
wc -c file.txt # Количество байт
4. Поиск: grep
grep — поиск текста по шаблону (регулярному выражению).
Основной синтаксис
grep "шаблон" файл
Примеры
# Простой поиск
grep "ERROR" app.log
# С номерами строк
grep -n "ERROR" app.log
# Без учёта регистра
grep -i "error" app.log
# Рекурсивно по всем файлам в директории
grep -r "TODO" ./src/
# Только имена файлов
grep -rl "password" ./configs/
# Обратный поиск (всё, кроме совпадений)
grep -v "DEBUG" app.log
# Контекст: 2 строки до и после совпадения
grep -B 2 -A 2 "FATAL" app.log
# Регулярные выражения ( расширенный синтаксис)
grep -E "^[0-9]{4}-[0-9]{2}" app.log # Строки, начинающиеся с даты
# Подсчёт совпадений
grep -c "ERROR" app.log
# Использование пайпа (stdin)
cat app.log | grep "ERROR" | grep "database"
Практические примеры для QA
# Найти все ошибки в логах за сегодня
grep "$(date +%Y-%m-%d)" app.log | grep -i "error"
# Найти тестовые аккаунты в логах
grep -E "test_.*@example\.com" auth.log
# Найти медленные запросы (> 1000ms)
grep -E "duration: [0-9]{4,}ms" api.log
# Проверить, запущен ли сервис
ps aux | grep "node"
5. Поиск файлов: find
# Найти файл по имени
find /var/log -name "*.log"
# Без учёта регистра
find . -iname "readme*"
# Найти файлы по типу (f — файл, d — директория)
find . -type f -name "*.py"
find . -type d -name "test*"
# Найти файлы по размеру
find . -size +100M # Больше 100 МБ
find . -size -1k # Меньше 1 КБ
# Найти файлы по дате изменения
find . -mtime -7 # Изменённые за последние 7 дней
find . -mmin -60 # Изменённые за последний час
# Найти и выполнить команду
find . -name "*.tmp" -delete # Найти и удалить
find . -name "*.log" -exec wc -l {} \; # Подсчитать строки
Практические примеры
# Найти все автотесты
find . -name "*_test.py" -o -name "test_*.py"
# Найти большие лог-файлы
find /var/log -name "*.log" -size +50M
# Найти файлы, изменённые после деплоя
find /app -name "*.js" -newer /app/deploy_marker
6. Права доступа: chmod
Структура прав
-rwxr-xr--
│├─┤├─┤├─┤
│ │ │ └─ Остальные (others)
│ │ └──── Группа (group)
│ └─────── Владелец (owner)
└────────── Тип (- файл, d директория, l ссылка)
Право
Буква
Число
Значение
Read
r
4
Чтение
Write
w
2
Запись
Execute
x
1
Выполнение
Числовой формат
chmod 755 script.sh # rwxr-xr-x (владелец всё, остальные чтение+выполнение)
chmod 644 config.yaml # rw-r--r-- (владелец чтение+запись, остальные чтение)
chmod 700 secret.sh # rwx------ (только владелец)
chmod +x script.sh # Добавить право на выполнение
chmod -w file.txt # Убрать право на запись
chmod u+x script.sh # Добавить выполнение только владельцу
chmod go-w file.txt # Убрать запись для группы и остальных
Практические примеры
# Сделать скрипт исполняемым
chmod +x run_tests.sh
# Защитить конфиг с паролями
chmod 600 .env
# Типичные права для веб-приложения
chmod 755 /var/www/html/ # Директории
chmod 644 /var/www/html/*.html # Файлы
7. Пайпы (pipes) и перенаправление
Пайп | — передача вывода между командами
# Вывод одной команды → ввод другой
ls -la | grep ".yaml" # Найти yaml-файлы
cat app.log | grep ERROR | wc -l # Посчитать ошибки
ps aux | grep node # Найти процесс node
cat users.csv | sort | uniq # Сортировка и уникальные строки
Перенаправление вывода
# > — перезаписать файл
echo "Hello" > file.txt # Создать/перезаписать файл
# >> — дописать в конец файла
echo "New line" >> file.txt # Добавить строку
# Перенаправить stderr (ошибки) в файл
command 2> errors.log
# Перенаправить и stdout, и stderr
command > output.log 2>&1
# Перенаправить stdin (ввод из файла)
mysql -u root database < script.sql
Комбинации пайпов и перенаправлений
# Сохранить результат в файл
grep "ERROR" app.log > errors_only.log
# Запустить тесты и сохранить вывод
pytest tests/ > test_output.txt 2>&1
# Проверить несколько логов
cat app.log worker.log | grep "FATAL" | sort | uniq -c | sort -rn
tee — одновременно в файл и на экран
# Вывод и на экран, и в файл
pytest tests/ | tee test_output.log
# Дописывать, а не перезаписывать
echo "new" | tee -a file.txt
# Поиск и замена в выводе (sed)
cat file.txt | sed 's/old/new/g' # Заменить все "old" на "new"
# Вырезать столбцы (awk, cut)
cat data.csv | cut -d',' -f2 # Второй столбец CSV
cat data.csv | awk '{print $1, $3}' # Первый и третий столбец
# Сортировка
sort file.txt # Алфавитная сортировка
sort -n numbers.txt # Числовая сортировка
sort -r file.txt # Обратная сортировка
# Уникальные строки
sort file.txt | uniq # Уникальные строки
sort file.txt | uniq -c # С подсчётом повторов
# Последние строки (для логов)
tail -f /var/log/syslog # Следить в реальном времени
Информация о системе
whoami # Текущий пользователь
hostname # Имя компьютера
uname -a # Информация об ОС
df -h # Дисковое пространство
free -h # Оперативная память
top # Процессы в реальном времени
ps aux # Все процессы
kill -9 PID # Убить процесс по ID
# Посмотреть переменную
echo $HOME
echo $PATH
echo $USER
# Посмотреть все переменные
env
printenv
# Установить переменную (временно, только в текущей сессии)
export API_KEY="abc123"
export DATABASE_URL="postgres://user:pass@localhost:5432/db"
# Установить переменную для одной команды
API_KEY="abc123" pytest tests/
# Убрать переменную
unset API_KEY
Практические примеры для QA
# Запустить тесты с разным окружением
ENV=staging pytest tests/
ENV=production pytest tests/
# Передать credentials через переменные
export TEST_USER="admin@example.com"
export TEST_PASS="password123"
pytest tests/login_test.py
10. Алиасы
# Создать алиас (временно)
alias ll='ls -la'
alias gt='git status'
alias dc='docker-compose'
# Постоянные алиасы (добавить в ~/.bashrc или ~/.zshrc)
echo "alias ll='ls -la'" >> ~/.bashrc
source ~/.bashrc
# Посмотреть все алиасы
alias
# Удалить алиас
unalias ll
Полезные алиасы для QA
alias ll='ls -la'
alias gs='git status'
alias gp='git pull'
alias gd='git diff'
alias gl='git log --oneline --graph --all'
alias dcu='docker-compose up -d'
alias dcd='docker-compose down'
alias dps='docker ps'
alias logs='tail -f'
alias mytest='pytest -v --tb=short'