34 карточек синтаксиса на одной странице: короткий пример кода и
подпись, где обычно ошибаются. Работает Ctrl+F, у каждой карточки — своя ссылка, а те же
карточки открываются прямо в редакторе Koddo, пока ты решаешь задачу.
Навигация, создание, копирование и удаление — команды первого дня.
Навигация: pwd, ls, cd
pwd # /workls # projects reportsls -a # + скрытые: . .. .gitcd projects/blog # относительный путьcd /work # абсолютный, от корняcd - # назад, где был
Относительный путь считается от текущего каталога, абсолютный начинается с /. Скрытые файлы — любые имена с точки: ls их прячет без -a.
Создание: mkdir -p и touch
mkdir docs # один каталогmkdir -p reports/2026/aug # вся цепочка сразуtouch notes.txt # пустой файл
Без -p mkdir падает, если родительских каталогов нет, и ругается File exists на повторный запуск. touch у существующего файла лишь обновляет время изменения.
Копирование и переименование: cp, mv
cp draft.md final.md # копия файлаcp -r projects backup # каталог — только с -rmv final.md docs/ # переместитьmv draft.md intro.md # переименовать (та же команда)
Переименование и перемещение — одна операция mv: меняется путь. cp без -r молча пропускает каталоги: «-r not specified; omitting directory».
Удаление: rm и rm -r
rm notes.txt # файлrm backup # каталог так нельзя: Is a directoryrm -r backup # каталог со всем содержимымls build/*.tmp # СНАЧАЛА проверить маскуrm build/*.tmp # потом удалять
Корзины в терминале нет: rm -r удаляет сразу и навсегда, а rm -rf не переспросит даже про защищённые файлы. Перед удалением по маске прогони её через ls.
cat хорош для коротких файлов, длинные листай в less. tail -f не завершается и печатает дописываемые строки — стандартный способ смотреть логи; выход Ctrl+C.
Справка: man, --help, which
man ls # полное руководство, q выходls --help # короткая выжимка флаговwhich ls # /usr/bin/ls — что запускается
man листается как less: / ищет, q выходит. which — первый шаг диагностики «команда ведёт себя странно»: показывает, какой именно файл выполняется вместо ожидаемого.
find . -name "*.log" # по маске от текущего каталогаfind . -iname "APP.LOG" # без учёта регистраfind / -name "config.yaml" 2>/dev/null # по всей системе
Маску всегда бери в кавычки: без них шелл раскроет звёздочку по текущему каталогу до запуска find. Хвост 2>/dev/null прячет Permission denied при поиске от корня.
find: по типу и свойствам
find . -type d # только каталогиfind . -type f -name "*.py" # только файлыfind . -type f -mtime -1 # изменённые за суткиfind . -type f -size +100M # больше 100 МБ
Условия комбинируются простым перечислением — это логическое И. -mtime считает сутками: -1 значит «моложе 24 часов», +7 — «старше недели».
{} — место подстановки найденного, + собирает все находки в один вызов команды. Перед разрушающим -exec запусти тот же find без него и проверь список.
grep: поиск текста в файле
grep "ERROR" app.log # строки с ERRORgrep -n "ERROR" app.log # + номера строкgrep -in "error" app.log # без учёта регистра
grep по умолчанию чувствителен к регистру: без -i строки с error в нижнем регистре молча выпадут из выдачи, и пропажу легко не заметить.
grep -r: поиск по проекту
grep -rn "TODO" . # рекурсивно, файл:строкаgrep -rl "TODO" src/ # только имена файловgrep -rn --exclude-dir=node_modules --exclude-dir=.git "TODO" .
Каталог grep сам не обходит — без -r ответит Is a directory. В репозиториях сразу исключай .git и node_modules, иначе выдачу зальёт служебными совпадениями.
grep -v и -c: фильтр и счёт
grep -v "INFO" app.log # строки БЕЗ образцаgrep -c "INFO" app.log # только число совпавших строкps aux | grep -v grep | grep nginx # классика фильтров
-v инвертирует условие, -c печатает счётчик вместо строк. В связке ps | grep сам grep попадает в выдачу — его выкидывают через -v grep (или берут pgrep).
Перенаправление вывода, поток ошибок и связки команд через |.
Перенаправление: > и >>
echo "молоко" > list.txt # перезаписать файлecho "хлеб" >> list.txt # дописать в конецsort data.txt > data.txt # ЛОВУШКА: файл очиститсяsort -o data.txt data.txt # сортировка на месте — так
Файл после > очищается до запуска команды, поэтому перенаправление в тот же файл уничтожает данные: sort уже читает пустоту. Для записи «на место» у sort есть -o.
Потоки ошибок: 2>&1 и /dev/null
cmd > out.log # только stdout, ошибки на экранеcmd > all.log 2>&1 # оба потока в файлcmd 2>/dev/null # спрятать ошибкиcmd 2>&1 > out.log # ЛОВУШКА: ошибки мимо файла
У процесса два выходных потока: stdout (1) и stderr (2). Порядок важен: 2>&1 значит «туда, куда 1 смотрит сейчас», поэтому пишется после > файла, не до.
Конвейер: sort | uniq -c
sort tags.txt | uniq -c | sort -nr# 3 python# 2 sql# 1 linux — частотный словарь тремя командами
| соединяет stdout левой команды со stdin правой. uniq схлопывает только соседние повторы, поэтому перед ним обязателен sort — иначе дубли молча останутся.
Подсчёт: wc -l
wc -l app.log # строк в файлеls | wc -l # записей в каталогеgrep -r "TODO" . | wc -l # пометок в проекте
wc -l считает строки, -w слова, -c байты. В конвейере это универсальный финальный шаг «сколько всего» для вывода любой команды.
tee: на экран и в файл разом
./deploy.sh | tee deploy.log # видно и записано./deploy.sh | tee -a deploy.log # дописывать, не перезаписывать
tee дублирует поток: печатает на экран и одновременно пишет в файл. Без -a каждый запуск перезапишет лог предыдущего — для накопления флаг обязателен.
Цепочки: && и ||
mkdir -p build && cd build # cd только при успехеnpm test || echo "тесты упали" # правая часть при провалеcmd1 ; cmd2 # просто подряд, без условий
&& запускает правую команду только при успехе левой (код возврата 0), || — только при провале. Точка с запятой условий не ставит: выполнится всё подряд.
Триады rwx, числовая запись chmod и владельцы файлов.
Читаем ls -l: rwx по ролям
ls -l deploy.sh# -rwxr-xr-x 1 alice dev 41 Aug 12 10:00 deploy.sh# ^владелец ^группа ^остальные (r читать w писать x выполнять)
Первый символ — тип (- файл, d каталог, l ссылка), дальше три триады: владелец, группа, остальные. На каталоге x значит «право войти», а r — лишь читать список имён.
Каждая цифра — сумма прав одной роли: r=4, w=2, x=1; семёрка — всё, пятёрка — чтение и выполнение. chmod 777 «чинит» Permission denied ценой записи для любого процесса — не решение.
chmod буквами: u+x, g-w
chmod +x script.sh # исполняемый — самый частый вызовchmod u+x tool.sh # x только владельцуchmod g-w shared.txt # забрать запись у группы./script.sh # запуск: ./ обязателен
u владелец, g группа, o остальные, a все; + добавить, - забрать. Точка со слэшем при запуске обязательна: без ./ шелл ищет команду в PATH, а не в текущем каталоге.
chown: владелец и группа
sudo chown alice report.txt # сменить владельцаsudo chown alice:dev report.txt # владельца и группуsudo chown -R alice:dev /srv/app # рекурсивно
chmod меняет биты, chown — кому они принадлежат; менять владельца может только root. Связка «группа dev + права 640» — стандартный способ дать доступ команде, а не людям поодиночке.
Новые файлы стартуют от 666, каталоги от 777, маска вычитает биты. На серверах обычна маска 0022 (файлы 644); umask 027 закрывает файлы от посторонних с момента создания.
Посмотреть, запустить в фоне, остановить — и прочитать код возврата.
Посмотреть процессы: ps, pgrep
ps aux # все процессы системыps -o pid,stat,cmd -p 42 # конкретный PIDpgrep -a nginx # PID + команда по имени
ps aux — снимок всей системы: USER, PID, %CPU, %MEM, STAT, COMMAND. pgrep ищет по имени и, в отличие от ps | grep, не ловит в выдачу сам себя.
Фон: &, $! и wait
sleep 300 & # запустить в фонеecho $! # PID последнего фоновогоwait $! # дождаться его завершения
& возвращает управление сразу, процесс работает в фоне. $! — PID последнего фонового процесса: сохрани его сразу, следующий & перезапишет значение.
kill: сначала TERM, потом -9
kill 4242 # SIGTERM: вежливо, можно убратьсяkill -9 4242 # SIGKILL: ядро снимает без уборкиpgrep -a node # перед pkill — проверь, кого убьёшь
kill без номера шлёт SIGTERM — процесс может дописать данные и выйти. SIGKILL не перехватывается: недописанные файлы и незакрытые транзакции останутся. Поэтому -9 — последний аргумент.
Сигналы и trap
# TERM(15) стоп · KILL(9) насильно · INT(2) Ctrl+C · HUP(1)trap 'rm -f "$tmp"; exit' TERM INT # уборка при остановкеkill -l # весь список сигналов
SIGTERM и SIGINT перехватываемы — на этом строится graceful shutdown (docker stop и systemctl stop шлют именно TERM). SIGKILL и SIGSTOP перехватить нельзя.
Коды возврата: $? и 128+N
ls /nope; echo $? # 2 — ошибка# убит сигналом → 128 + номер:# 143 = TERM(15) · 137 = KILL(9, часто OOM) · 130 = Ctrl+C(2)
0 — успех, всё остальное — ошибка; $? хранит код последней команды. Числа выше 128 читаются как «снят сигналом»: 137 в логах CI и Docker — почти всегда нехватка памяти.
Система: top, df -h, du -sh
top # живая таблица процессов, q выходdf -h # свободное место по дискамdu -sh logs/ # сколько весит каталог
top — динамика вместо снимка ps; удобнее его htop, если установлен. df смотрит на файловые системы целиком, du — на конкретный каталог: пара для вопроса «куда делось место».
Учётные записи, группы и повышение привилегий без постоянного root.
Кто я: whoami, id, groups
whoami # aliceid # uid=1001(alice) gid=1001(alice) groups=...,1002(dev)groups # alice dev
uid — числовой идентификатор пользователя, gid — его первичная группа; root — это uid 0, для него проверки прав не выполняются. id alice покажет то же про другого.
sudo выполняет команду от root по твоему паролю и пишет каждое использование в журнал — поэтому он безопаснее постоянной работы под root, где любая опечатка в rm необратима.
Создать пользователя: useradd -m
sudo useradd -m -s /bin/bash alice # с домом и bashsudo passwd alice # задать парольgrep "^alice" /etc/passwd # проверить запись
Без -m домашний каталог не создастся, без -s шеллом будет /bin/sh. Учётки лежат строками в /etc/passwd, хэши паролей — в закрытом /etc/shadow.
Группы: usermod -aG (только с -a!)
sudo groupadd devsudo usermod -aG dev alice # ДОБАВИТЬ в группу# usermod -G dev alice — ЗАМЕНИТ весь список групп!id alice # проверить членство
Флаг -a означает append: без него -G заменяет список дополнительных групп целиком, и пользователь молча вылетает из sudo и docker. Новые группы процесс получает только после перелогина.
su: сессия под другим пользователем
su - alice # войти как alice (пароль alice)whoami # aliceexit # вернуться в свою сессию
Дефис у su - важен: он даёт полноценное окружение пользователя, а не только имя. Для админ-задач предпочитай sudo — он точечный и оставляет след в журнале.