ШПАРГАЛКА

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 ответят почти на любой вопрос быстрее, чем поиск в интернете.

Поддержать проект