Bash и терминал Linux
Шпаргалка по Bash и терминалу Linux: навигация, файлы, поиск, пайпы и редиректы, права, переменные, скрипты, процессы, tar и горячие клавиши.
Bash — командная оболочка, которая работает почти на каждом Linux-сервере и в macOS. Освоив десяток команд и базовый синтаксис скриптов, вы автоматизируете рутину, разбираете логи и управляете процессами быстрее, чем мышкой. Эта шпаргалка собирает самое нужное: от перемещения по папкам до пайпов, прав доступа и циклов.
Навигация по файловой системе
Три кита перемещения: pwd показывает текущий каталог, ls выводит содержимое, cd переходит в другую папку.
pwd # где я сейчас (print working directory)
ls # список файлов в текущей папке
ls -la # все файлы (включая скрытые) + детали
ls -lh /var/log # человекочитаемые размеры (K, M, G)
cd /etc # перейти по абсолютному пути
cd .. # на уровень вверх
cd ~ # в домашний каталог
cd - # вернуться в предыдущий каталог
Скрытые файлы начинаются с точки (.bashrc) — их показывает флаг -a. Тильда ~ всегда означает домашнюю папку пользователя.
Работа с файлами и папками
Создание, копирование, перемещение и удаление — повседневные операции. Будьте осторожны с rm: корзины в терминале нет.
mkdir project # создать папку
mkdir -p a/b/c # создать вложенные папки разом
touch file.txt # создать пустой файл / обновить дату
cp file.txt copy.txt # копировать файл
cp -r src/ backup/ # копировать папку рекурсивно
mv file.txt docs/ # переместить
mv old.txt new.txt # переименовать
rm file.txt # удалить файл
rm -r folder/ # удалить папку рекурсивно
rm -i *.log # спрашивать подтверждение перед удалением
rmdir empty/ # удалить только пустую папку
Совет: перед rm -rf всегда проверяйте путь командой ls. Флаг -f подавляет вопросы и игнорирует ошибки — мощно и опасно.
Просмотр содержимого файлов
Чтобы заглянуть внутрь файла, не открывая редактор, используйте cat, less, head и tail.
cat notes.txt # вывести файл целиком
cat -n notes.txt # с номерами строк
less bigfile.log # листать постранично (q — выход, / — поиск)
head file.txt # первые 10 строк
head -n 20 file.txt # первые 20 строк
tail file.txt # последние 10 строк
tail -n 50 file.txt # последние 50 строк
tail -f app.log # следить за файлом в реальном времени (логи!)
Команда tail -f незаменима для наблюдения за растущими логами: новые строки появляются на экране сразу.
Поиск: find и grep
find ищет файлы по имени, размеру, дате; grep ищет текст внутри файлов.
# find — поиск файлов
find . -name "*.py" # все .py в текущем дереве
find /var -type f -size +100M # файлы больше 100 МБ
find . -mtime -7 # изменённые за последние 7 дней
find . -name "*.tmp" -delete # найти и удалить
# grep — поиск текста
grep "error" app.log # строки со словом error
grep -i "Error" app.log # без учёта регистра
grep -rn "TODO" src/ # рекурсивно + номера строк
grep -v "DEBUG" app.log # инвертировать: строки БЕЗ DEBUG
grep -c "404" access.log # посчитать совпадения
Флаги легко запомнить: -i — ignore case, -r — recursive, -n — number, -v — invert, -c — count.
Пайпы и перенаправление
Здесь живёт сила Unix. Символ пайпа (|) отправляет вывод одной команды на вход другой. Символы > и >> перенаправляют вывод в файл.
cat access.log | grep "404" # пайп: вывод cat -> вход grep
echo "Привет" > file.txt # записать в файл (перезаписать!)
echo "Ещё строка" >> file.txt # дописать в конец файла
command < input.txt # взять stdin из файла
command 2> errors.txt # перенаправить только ошибки (stderr)
command > out.txt 2>&1 # и вывод, и ошибки в один файл
command > /dev/null 2>&1 # выбросить весь вывод
Потоки нумерованы: 0 — stdin, 1 — stdout, 2 — stderr. Запись 2>&1 означает «направь поток ошибок туда же, куда идёт обычный вывод». Помните: одиночный > перезаписывает файл, а двойной >> дописывает.
Права доступа: chmod и chown
Каждый файл имеет права для владельца, группы и остальных: чтение (r=4), запись (w=2), выполнение (x=1).
ls -l script.sh # посмотреть права: -rwxr-xr--
chmod +x script.sh # сделать файл исполняемым
chmod 755 script.sh # rwx для владельца, r-x для остальных
chmod 644 file.txt # rw- владелец, r-- остальные
chmod -R 755 dir/ # рекурсивно для всей папки
chown user file.txt # сменить владельца
chown user:group file.txt # владельца и группу
sudo chown -R www-data: /var/www # рекурсивно
Цифровая запись складывает значения: 7 = 4+2+1 (rwx), 6 = 4+2 (rw-), 5 = 4+1 (r-x). Так 755 — это «владельцу всё, остальным читать и запускать».
Переменные окружения
Переменные окружения настраивают поведение программ. Их выводит env, а export делает переменную доступной дочерним процессам.
echo $HOME # домашний каталог
echo $PATH # где искать исполняемые файлы
echo $USER # имя пользователя
export API_KEY="secret123" # объявить переменную окружения
export PATH="$PATH:/opt/bin" # добавить путь в PATH
env # все переменные окружения
unset API_KEY # удалить переменную
# постоянные переменные — в ~/.bashrc или ~/.profile
echo 'export EDITOR=nano' >> ~/.bashrc
Переменная PATH — список папок через двоеточие, где оболочка ищет команды. Изменения в ~/.bashrc применяются в новых сессиях или после source ~/.bashrc.
Основы скриптов
Скрипт — это текстовый файл с командами. Первая строка shebang указывает, чем его запускать.
#!/bin/bash
# greet.sh — простой скрипт
name="Мир" # переменная (без пробелов вокруг =)
echo "Привет, $name!" # подстановка значения
echo "Текущая папка: $(pwd)"
Запуск: chmod +x greet.sh, затем ./greet.sh. Обращение к переменной — через $. Кавычки двойные допускают подстановку, одинарные — нет.
Аргументы командной строки
#!/bin/bash
echo "Скрипт: $0" # имя самого скрипта
echo "Первый арг: $1" # первый аргумент
echo "Второй арг: $2" # второй аргумент
echo "Все аргументы: $@"
echo "Их количество: $#"
# запуск: ./script.sh apple banana
# $1 = apple, $2 = banana, $# = 2
Условия: if
#!/bin/bash
if [ -f "config.txt" ]; then
echo "Файл существует"
elif [ -d "config" ]; then
echo "Это папка"
else
echo "Ничего не найдено"
fi
# числа: -eq -ne -lt -gt -le -ge
n=5
if [ "$n" -gt 3 ]; then
echo "$n больше трёх"
fi
Проверки файлов: -f файл существует, -d папка, -e существует что угодно, -z строка пустая. Не забывайте пробелы внутри [ ] — без них синтаксическая ошибка.
Циклы: for и while
# for по списку
for fruit in apple banana cherry; do
echo "Фрукт: $fruit"
done
# for по файлам
for f in *.txt; do
echo "Обрабатываю $f"
done
# for по диапазону чисел
for i in {1..5}; do
echo "Шаг $i"
done
# while
count=1
while [ "$count" -le 3 ]; do
echo "Итерация $count"
count=$((count + 1))
done
Арифметика — внутри $(( )). Конструкция {1..5} разворачивается в последовательность 1 2 3 4 5.
Функции
#!/bin/bash
greet() {
local name="$1" # local — локальная переменная
echo "Привет, $name!"
}
greet "Аня" # вызов с аргументом
greet "Боря"
sum() {
echo $(( $1 + $2 ))
}
result=$(sum 3 4) # захват результата
echo "Сумма: $result"
Внутри функции аргументы доступны как $1, $2 и т.д. — так же, как в скрипте. Слово local ограничивает переменную телом функции.
Подстановка команд
Запись $(команда) подставляет результат выполнения прямо в строку. Это современная и предпочтительная форма (старая — обратные кавычки).
today=$(date +%Y-%m-%d) # сохранить дату в переменную
echo "Сегодня: $today"
files=$(ls | wc -l) # посчитать файлы
echo "Файлов в папке: $files"
echo "Текущий пользователь: $(whoami)"
# можно вкладывать
backup="backup_$(date +%H%M).tar"
Подстановка выполняется до запуска основной команды: оболочка сначала вычисляет $( ), потом подставляет вывод на это место.
Шаблоны имён (wildcards)
Оболочка сама разворачивает специальные символы в списки файлов ещё до запуска команды.
ls *.txt # * — любое количество любых символов
ls report?.pdf # ? — ровно один любой символ
ls file[123].txt # [123] — один символ из набора: 1, 2 или 3
ls log[a-z].txt # диапазон символов
ls *.{jpg,png} # несколько расширений
rm temp_* # удалить всё, что начинается с temp_
cp *.conf backup/ # скопировать все .conf
Внимание: * в оболочке — это «любые символы», а не регулярное выражение. Если совпадений нет, шаблон остаётся как есть.
Процессы: ps, kill, фоновый запуск
Каждая программа — это процесс со своим номером PID. Их показывает ps, останавливает kill.
ps aux # все процессы системы
ps aux | grep nginx # найти конкретный процесс
top # интерактивный монитор (q — выход)
kill 1234 # послать сигнал процессу с PID 1234
kill -9 1234 # принудительно убить (SIGKILL)
pkill firefox # убить по имени
sleep 60 & # запустить в фоне (& в конце)
jobs # фоновые задачи текущей сессии
fg # вернуть задачу на передний план
nohup ./long.sh & # не прерывать при выходе из сессии
Символ & в конце команды запускает её в фоне, освобождая терминал. nohup защищает процесс от завершения при закрытии сессии.
Архивы: tar
tar упаковывает много файлов в один архив, опционально сжимая его gzip-ом.
# создать архив (c=create, z=gzip, v=verbose, f=file)
tar -czvf archive.tar.gz folder/
# распаковать (x=extract)
tar -xzvf archive.tar.gz
# распаковать в конкретную папку
tar -xzvf archive.tar.gz -C /tmp/
# посмотреть содержимое без распаковки
tar -tzvf archive.tar.gz
Мнемоника флагов: c — create, x — extract, t — list, z — gzip, v — verbose, f — указать имя файла. Флаг f всегда идёт последним перед именем архива.
Полезные комбинации
Настоящая магия терминала — в связках команд через пайпы. Несколько простых утилит вместе решают сложные задачи.
# топ-10 самых частых IP в логе
cat access.log | grep -oE "^[0-9.]+" | sort | uniq -c | sort -rn | head
# уникальные строки, отсортированные
sort names.txt | uniq
# посчитать строки, слова, символы
wc -l file.txt
# найти большие файлы и отсортировать
du -ah . | sort -rh | head -20
# заменить текст во всех файлах
grep -rl "old" . | xargs sed -i 's/old/new/g'
# процессы, жрущие память
ps aux | sort -rk4 | head -5
Связка sort | uniq -c | sort -rn — классика для подсчёта частот: сначала сортируем, считаем повторы, потом сортируем по убыванию числа.
Горячие клавиши терминала
Эти сочетания экономят часы. Они работают в большинстве оболочек и сильно ускоряют работу.
| Клавиши | Действие |
|---|---|
| Tab | Автодополнение команды или пути |
| Ctrl + C | Прервать текущую команду |
| Ctrl + D | Выйти из оболочки / конец ввода |
| Ctrl + L | Очистить экран (как clear) |
| Ctrl + R | Поиск по истории команд |
| Ctrl + A | В начало строки |
| Ctrl + E | В конец строки |
| Ctrl + U | Удалить от курсора до начала строки |
| Ctrl + K | Удалить от курсора до конца строки |
| Ctrl + W | Удалить слово перед курсором |
| Стрелки ↑ / ↓ | Листать историю команд |
Ctrl + R — самая недооценённая клавиша: начните печатать кусок старой команды, и оболочка найдёт её в истории.
Шпаргалка частых команд
Краткий справочник самого ходового — держите под рукой.
| Команда | Что делает |
|---|---|
pwd | Показать текущий каталог |
ls -la | Список файлов с деталями и скрытыми |
cd ~ | Перейти в домашнюю папку |
cp -r src dst | Копировать папку рекурсивно |
mv a b | Переместить или переименовать |
rm -r dir | Удалить папку |
mkdir -p a/b | Создать вложенные папки |
cat file | Вывести файл целиком |
tail -f log | Следить за логом в реальном времени |
grep -rn x . | Найти текст рекурсивно с номерами строк |
find . -name x | Найти файлы по имени |
chmod +x f | Сделать файл исполняемым |
ps aux | Список всех процессов |
kill -9 PID | Принудительно завершить процесс |
tar -czvf a.tgz d | Создать сжатый архив |
df -h | Свободное место на дисках |
history | История команд |
man cmd | Справка по команде |
И помните главное правило новичка: man команда и команда --help ответят почти на любой вопрос быстрее, чем поиск в интернете.